Linux进程控制函数


System()
#include<stdlib.h> int system(const char * string); system()会调用fork()产生子进程,由子进程来调用 /bin/sh -c string来执行参数string字符串所代表的 命令,此命令执行完后随即返回原调用的进程。 如果system()在调用/bin/sh时失败则返回127,其 他失败原因返回-1。如果system()调用成功则最后 会返回执行shell命令后的返回值,但是此返回值也 有可能为 system()调用/bin/sh失败所返回的127, 因此最好能再检查errno 来确认执行成功。
Linux进程控制函数
fork()
#include <unistd.h> #include<sys/types.h> pid_t fork( void );

一个现有进程可以调用fork函数创建一个新进程。由fork创建的 新进程被称为子进程。子进程是父进程的副本,它将获得父进 程数据空间、堆、栈等资源的副本。 pid_t 是一个宏定义,其实质是int,定义<sys/types.h>中。 返回值: 若成功调用一次则返回两个值,子进程返回0,父进 程返回子进程ID;否则,出错返回-1。 注意:子进程持有的是上述存储空间的“副本”,这意味着父 子进程间不共享这些存储空间。linux将复制父进程的地址空间 内容给子进程,因此,子进程有了独立的地址空间。

一个进程使用exec执行后,代码段、数据段、bss段 和堆栈都被新程序覆盖,唯一保留的是进程号。 *path说明由路径名指定执行程序。


*file说明由文件指定执行程序。 其第二个参数以及用省略号表示的其他参数一起组 成了该程序执行时的参数表,按照linux中的惯例, 参数表的第一项是不带路径的程序文件名。被调用 的程序可以访问这个参数表,它相当于shell下的命 令行参数。实际上,shell本身对命令的调用也是用 exec来实现的。由于参数的个数是任意的,所以需 要用一个NULL指针来标记参数表的结尾。
Exec()
#include <unistd.h> int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);
如:execl(“/bin/ls”,…)
示例代码
#include <process.h> #include <stdio.h> #include <errno.h> #include <unistd.h>
void main(int argc, char *argv[]) { int i; printf("Command line arguments:\n"); for (i=0; i<argc; i++) printf("[%2d] : %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); execv("CHILD.EXE", argv); return(0); }
Wait()
#include<sys/types.h> #include<sys/wait.h> pid_t wait (int * status);



暂停目前进程的执行,直到有信号来临或者子 进程结束。 如果在调用wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。 子进程的结束状态值会由参数status 返回,而 子进程的进程识别码也会一起返回。如果不在 意结束状态值,则参数status 可以设成NULL。
getpid(), getpid()
pid_t getpid(void) 取得本进程识别码,由pid_t记录目前进程 的进程识别码。 示例:“pid_t p=getpid();”
pid_t getppid(void) 取得父进程识别码。 其与getpid类似,区别在于其返回的是目前 进程的父进程识别码。


示例代码
#include<stdlib.h> main() { system(“ls -al /etc/passwd /etc/shadow”); }

执行结果: -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd -r--------- 1 root root 572 Sep 2 15 :34 /etc/shado


为什么fork()会返回两次?

由于在复制时复制了父进程的堆栈段,所 以两个进程都停留在fork函数中,等待返回。 因此,fork函数会返回两次。
一次是在父进程中返回,另一次是在子进 程中返回,这两次的返回值是不<sys/types.h> #include<unistd.h> #include<stdio.h> int main(int argc, char ** argv ) { int pid = fork(); if (pid == -1 ) { printf("error!"); } else if( pid == 0 ) { printf("This is the child process!"); } else{ printf("This is the parent process! child process id = %d", pid); } return 0; }

exec..是一个函数族,这里列出了它的六个函数。 功 能: 装入并运行其它程序。 fork()创建一个进程,但是这个进程只能局限在自身的代 码段范围内,不能去执行别的程序;使用exec函数调用, 用于从一个进程的地址空间中执行另外一个进程,覆盖自 己的地址空间,执行别的用户程序。
Exec()
示例代码
#include<sys/types.h> #include<unistd.h> #include<stdio.h> main() { int i,j,k; if (i=fork()) // 非零值 { j=wait(); printf("Parent process!\n"); printf(“i=%d j=%d\n”, i, j); } else { printf("Child process!\n"); printf(" CHILD: My PID is %d\n", getpid()); printf(" CHILD: My parent's PID is %d\n", getppid()); } }
合集下载

linux sched_setscheduler函数解析

linux sched_setscheduler函数解析

linux sched_setscheduler函数解析sched_setscheduler函数是一个Linux系统调用函数,用于修改进程的调度策略和优先级。

函数原型为:```cint sched_setscheduler(pid_t pid, int policy, const structsched_param *param);```参数说明:- pid:要修改调度策略和优先级的进程ID。

如果pid为0,则表示修改当前进程。

- policy:要设置的调度策略。

可以取以下值:- SCHED_OTHER:普通进程调度策略,即默认策略。

这是一个非实时调度策略,由时间片轮转算法控制。

- SCHED_FIFO:先进先出调度策略。

使用FIFO调度策略的进程优先级比其他普通进程高。

- SCHED_RR:轮转调度策略。

与FIFO策略类似,但进程会在使用完时间片后轮转到等待队列的末尾。

- SCHED_BATCH:批处理调度策略。

适合批处理作业,将进程聚集在一起批量执行。

- SCHED_IDLE:空闲调度策略。

只有在没有其他优先级较高的进程运行时,才会执行该进程。

- SCHED_DEADLINE:截止时间调度策略。

用于实时系统,根据任务的截止时间进行调度。

- param:一个指向sched_param结构体的指针,用于设置进程的优先级和其他调度参数。

sched_param结构体包含一个int类型的成员sched_priority,表示进程的优先级。

函数返回值为0表示成功,返回-1表示失败并设置errno。

sched_setscheduler函数用于修改进程的调度策略和优先级。

在修改调度策略之前,需要获得相应的权限。

调用该函数后,进程会立即按照新的调度策略和优先级进行调度。

注意事项:- 一些调度策略(如SCHED_FIFO和SCHED_RR)需要root权限,因此需要以root用户身份运行程序或具有相应的权限。

- 修改调度策略和优先级可能会影响系统的整体性能和稳定性,需要谨慎使用。

Linux系统编程之进程控制(进程创建、终止、等待及替换)

Linux系统编程之进程控制(进程创建、终止、等待及替换)

Linux系统编程之进程控制(进程创建、终⽌、等待及替换)进程创建在上⼀节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建⼀个新进程。

那么,系统是如何创建⼀个新进程的呢?这就需要我们更深⼊的剖析fork 函数。

1.1 fork函数的返回值调⽤fork创建进程时,原进程为⽗进程,新进程为⼦进程。

运⾏man fork后,我们可以看到如下信息:#include <unistd.h>pid_t fork(void);fork函数有两个返回值,⼦进程中返回0,⽗进程返回⼦进程pid,如果创建失败则返回-1。

实际上,当我们调⽤fork后,系统内核将会做:分配新的内存块和内核数据结构(如task_struct)给⼦进程将⽗进程的部分数据结构内容拷贝⾄⼦进程添加⼦进程到系统进程列表中fork返回,开始调度1.2 写时拷贝在创建进程的过程中,默认情况下,⽗⼦进程共享代码,但是数据是各⾃私有⼀份的。

如果⽗⼦只需要对数据进⾏读取,那么⼤多数的数据是不需要私有的。

这⾥有三点需要注意:第⼀,为什么⼦进程也会从fork之后开始执⾏?因为⽗⼦进程是共享代码的,在给⼦进程创建PCB时,⼦进程PCB中的⼤多数数据是⽗进程的拷贝,这⾥⾯就包括了程序计数器(PC)。

由于PC中的数据是即将执⾏的下⼀条指令的地址,所以当fork返回之后,⼦进程会和⽗进程⼀样,都执⾏fork之后的代码。

第⼆,创建进程时,⼦进程需要拷贝⽗进程所有的数据吗?⽗进程的数据有很多,但并不是所有的数据都要⽴马使⽤,因此并不是所有的数据都进⾏拷贝。

⼀般情况下,只有当⽗进程或者⼦进程对某些数据进⾏写操作时,操作系统才会从内存中申请内存块,将新的数据拷写⼊申请的内存块中,并且更改页表对应的页表项,这就是写时拷贝。

原理如下图所⽰:第三,为什么数据要各⾃私有?这是因为进程具有独⽴性,每个进程的运⾏不能⼲扰彼此。

1.3 fork函数的⽤法及其调⽤失败的原因fork函数的⽤法:⼀个⽗进程希望复制⾃⼰,通过条件判断,使⽗⼦进程分流同时执⾏不同的代码段。

linux system函数详解

linux system函数详解

linux system函数详解Linux是一个开源的操作系统内核,以稳定、高效和安全性闻名。

在Linux系统中,系统函数是一组用于实现特定功能的函数集合。

这些函数提供了访问操作系统核心功能的接口,使程序能够与操作系统进行交互。

在Linux系统函数的详解中,以下是一些常用的系统函数:1. open()函数:该函数用于打开文件,并返回一个文件描述符。

文件描述符是操作系统分配给打开的文件的整数值,可以用于后续的文件操作,如读取和写入。

2. read()函数:read()函数用于从已打开的文件中读取数据。

它接受三个参数:文件描述符、数据缓冲区的地址和要读取的字节数。

该函数将读取的数据存储在缓冲区中,并返回实际读取的字节数。

3. write()函数:write()函数用于向已打开的文件写入数据。

它接受三个参数:文件描述符、要写入的数据缓冲区的地址和要写入的字节数。

该函数将缓冲区中的数据写入文件,并返回实际写入的字节数。

4. close()函数:close()函数用于关闭先前打开的文件。

它接受一个参数,即要关闭的文件描述符。

该函数将释放文件描述符并断开与文件的连接。

5. fork()函数:fork()函数用于创建一个子进程。

调用该函数后,父进程将创建一个新的子进程,并且子进程将继承父进程的代码段、数据段和堆栈等信息。

可以使用fork()函数来实现并行处理和任务分发。

6. exec()函数:exec()函数用于在当前进程中执行一个新的程序。

它接受两个参数:要执行的程序路径和命令行参数。

调用exec()函数后,当前进程的代码和数据将被替换为新程序的代码和数据,从而实现程序的替换执行。

这些系统函数是Linux系统编程中常用的一部分。

通过熟练使用这些系统函数,我们可以实现文件操作、进程控制、程序执行等功能。

同时,深入了解这些系统函数的原理和底层机制也有助于优化程序的性能和稳定性。

总之,熟悉和理解Linux系统函数是成为一名优秀的系统开发工程师的必备技能之一。

linux核心函数

linux核心函数

linux核心函数Linux 内核是操作系统的核心部分,它提供了操作系统的核心功能,包括进程管理、内存管理、文件系统等。

Linux 内核的源代码中包含了大量的函数,用于实现各种操作系统的功能。

以下是一些Linux 内核中常见的核心函数,它们扮演着关键的角色:1.进程管理函数:–fork():创建一个新的进程。

–exec():在当前进程中执行一个新的程序。

–wait():等待子进程结束。

–exit():终止当前进程。

2.调度和任务管理函数:–schedule():进行进程调度。

–yield():主动让出CPU,将当前进程移动到就绪队列的末尾。

–wake_up_process():唤醒一个等待中的进程。

3.内存管理函数:–kmalloc():在内核中分配内存。

–kfree():释放内核中的内存。

–vmalloc():在虚拟地址空间中分配内存。

4.文件系统函数:–open():打开一个文件。

–read():从文件中读取数据。

–write():向文件中写入数据。

–close():关闭文件。

5.设备驱动函数:–register_chrdev():注册字符设备。

–unregister_chrdev():注销字符设备。

–request_irq():注册中断处理函数。

6.网络函数:–socket():创建套接字。

–bind():将套接字与地址绑定。

–listen():侦听传入连接请求。

–accept():接受传入的连接请求。

7.定时器和时钟函数:–timer_create():创建一个定时器。

–timer_settime():设置定时器的时间。

–gettimeofday():获取当前时间。

8.同步和互斥函数:–spin_lock():获取自旋锁。

–spin_unlock():释放自旋锁。

–mutex_lock():获取互斥锁。

–mutex_unlock():释放互斥锁。

这些函数仅仅是Linux 内核中众多函数的一小部分,Linux 内核的源代码非常庞大而复杂,包含了各种各样的功能和模块。

linux系统函数

linux系统函数

linux系统函数Linux系统函数是在Linux操作系统中使用的函数库。

这些函数提供了许多常用的功能,如文件操作、进程管理、网络通信等等。

本文将介绍一些常用的Linux系统函数及其用法。

一、文件操作函数1. fopenfopen函数用于打开文件。

它的原型如下:FILE *fopen(const char *path, const char *mode);其中,path是文件路径,mode是打开文件的模式。

mode可以是以下之一:- 'r':只读模式,打开文件用于读取。

- 'w':写模式,打开文件用于写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则清空文件内容。

- 'a':追加模式,打开文件用于写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则在文件末尾追加内容。

- 'r+':读写模式,打开文件用于读取和写入。

- 'w+':读写模式,打开文件用于读取和写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则清空文件内容。

- 'a+':读写模式,打开文件用于读取和写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则在文件末尾追加内容。

fopen函数返回一个指向文件的指针。

如果打开文件失败,则返回NULL。

fclose函数用于关闭文件。

它的原型如下:int fclose(FILE *stream);其中,stream是指向要关闭的文件的指针。

如果关闭文件成功,则返回0;否则返回EOF。

3. freadfread函数用于从文件中读取数据。

它的原型如下:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);其中,ptr是一个指向要读取数据的缓冲区的指针;size是每个数据项的大小;count是要读取的数据项数;stream是指向要读取的文件的指针。

prctl函数

prctl函数

prctl函数
prctl函数(processcontrol)是Linux系统中的一种控制进程的函数,它可以用来设置进程的状态和属性,比如进程的安全检查、操作系统的资源限制、设备类型、优先级等,从而可以对进程做出精确的控制。

prctl函数是Linux系统为了实现通用进程控制而引入的一种函数,它可以控制进程,使其符合操作系统的配置要求。

prctl函数不仅可以控制进程,还可以改变进程的状态,调整其优先级,以及设置安全策略等。

prctl函数的调用最常见的就是安全性检查,它可以检测进程是否安全,也可以检测进程是否越权访问系统资源。

另外,prctl函数还可以用来设置进程的优先级,可以控制进程获得系统资源的频率,以及可以设置进程的限制,如可以限制进程的执行时间、空间占用等。

prctl函数也可以用于设置进程的特殊属性,如进程可以设置为守护进程、可重启进程,以及可以设置进程为受保护进程等。

prctl 函数也可以用于禁止进程访问某些文件,或者禁止进程使用某些设备类型等。

prctl函数的使用和优势是显而易见的,它可以使系统的管理更加完善,对于对安全性要求较高的系统来说,使用prctl函数可以有效防止不安全进程对系统的危害,也能够更加安全、稳定地运行系统。

此外,prctl也可以为系统资源更好地管理带来便利,可以有效地控制进程的使用,使系统运行更加顺畅。

综上所述,prctl函数可以为Linux系统提供安全、可靠的进程控制服务,具有安全性检查、调整优先级、进程限制、设置特殊属性等诸多优点,可以有效地提高系统的运行效率,免除不少的管理工作。

但是,在使用prctl函数的时候,还是要小心谨慎,不要设置特别高的进程优先级或者过度有权限,以免影响系统的正常运行。

linux 中的进程处理和控制方式

linux 中的进程处理和控制方式Linux 是一种广泛使用的操作系统,它具有强大的进程处理和控制功能。

在 Linux 系统中,进程是进行任务的基本单位,它们可以同时运行,互相通信,共享资源,因此进程处理和控制是 Linux 系统重要的组成部分。

Linux 提供了多种方式来处理和控制进程。

以下是一些常见的方式:1. 创建新进程:在 Linux 系统中,可以通过 fork() 系统调用创建一个新的子进程。

子进程是通过复制父进程的内存空间、文件描述符和其他资源来创建的。

这样可以实现并行处理任务,提高系统的效率。

创建新进程时,可以使用 exec() 系统调用来加载一个新的程序运行。

2. 进程调度:Linux 使用调度器(scheduler)来决定哪个进程在何时执行。

调度算法会根据进程的优先级(priority)和调度策略来决定进程的执行顺序。

常见的调度策略包括先进先出(FIFO)、最短作业优先(SJF)、轮转(Round Robin)等。

通过合理的调度算法,可以提高系统的响应速度和资源利用率。

3. 进程间通信:在 Linux 中,进程之间可以通过多种方式进行通信。

其中最常用的方式是通过管道(pipe)、信号(signal)和共享内存(shared memory)来进行进程间的数据交换。

管道可以实现进程的单向通信,信号可以用于进程之间的异步通信,而共享内存可以让多个进程共享同一片内存区域,实现高效的数据交换。

4. 进程控制:Linux 提供了多个命令和系统调用来控制进程的行为。

例如,可以使用 ps 命令来查看系统中正在运行的进程,使用kill 命令发送信号终止进程,使用 nice 命令来改变进程的优先级等。

此外,还可以使用进程控制信号(Process Control Signals)来改变进程的状态,如暂停、继续、停止等。

5. 进程管理工具:Linux 提供了一些进程管理工具来帮助用户更方便地处理和控制进程。

Linux C 一些函数 所属的头文件

Linux C 一些函数所属的头文件在编写程序时,有时总是不记得所使用的函数在哪个库函数中。

现在先把自己以前经常用到的函数头文件总结一下。

有不对的地方还请指教。

1,系统调用文件的操作函数#inlclude <fcntl.h>int open(char *name,int how) 第二个参数,O_RDONLY O_WRONL Y O_RDWR O_CREAT #include <unistd.h>int close(int fd)size_t read(int fd,void *buf, size_t count)size_t write(int fd,const void *buf,size_t count)sleep(1) 系统睡眠一秒钟,最小单位为一秒。

#define msleep(x) usleep(x*1000)msleep(500); 系统睡眠0.5秒#include <stdio.h>perror("会出现错误的函数名")#include <string.h>char *strerror(int errnum) 依据错误代码errnum来查找错误原因字符串char *strcpy(char *dest,const char *src)int strcmp(char *s1,const char *s2) s1若等于s2的值则返回0值int strncmp(char *s1,const char *s2,int n) 前n个字符串比较2,进程控制函数#include <unistd.h>pid_t fork(void) 子进程中返回0 父进程中返回子进程ID 出错返回-1pid_t getpid(void) pid_t getppid(void)pid_t vfork(void)exec函数族进程pid 的类型为pid_t 类型,它包含于#include <sys/types.h> 若定义一个进程pid变量,则需要包含此头文件exit(n)结束进程父进程可以由wait函数来获得子进程结束装状态。

sigprocmask函数

sigprocmask函数Sigprocmask函数是Linux/Unix操作系统中实现进程对信号的控制机制之一,它允许进程暂时阻塞或者屏蔽一组信号。

本文将介绍sigprocmask函数的用法以及它的实现原理。

Sigprocmask函数定义在头文件<signal.h>中,可以用来控制进程阻塞或者屏蔽信号。

它的声明如下:int sigprocmask(int how,const sigset_t *set,sigset_t*oldset);Sigprocmask函数的第一个参数how指定对信号集的操作,它可以取以下三个值:1. SIG_BLOCK:阻塞信号集中的信号,它表示新的信号将被添加到进程当前的阻塞信号集中;2. SIG_UNBLOCK:从进程的阻塞信号集中移除一个或多个信号;3. SIG_SETMASK:用指定的信号集替换当前进程的阻塞信号集。

Sigprocmask函数的第二个参数set为一个指向sigset_t类型数据的指针,它指定要操作的信号集合。

第三个参数oldset中保存着函数之前设置的屏蔽字,它可以用来保存当前的信号屏蔽字,然后在调用函数之后再恢复之前的信号屏蔽字。

Sigprocmask函数的实现原理是,当进程收到一个信号时,内核就会将其加入到进程的阻塞信号集中,这个阻塞信号集中的信号将会被延迟执行,直到进程将其移出阻塞信号集中。

Sigprocmask函数就是用来修改这个阻塞信号集中的信号的。

当执行sigprocmask函数时,内核会在没有被阻塞的信号到来之前,将新的阻塞状态立即设置为有效。

如果在sigprocmask函数返回之前收到了一个信号,则这个信号将会被添加到阻塞信号集中,在新的阻塞状态有效之前不会被处理。

Sigprocmask函数的一个典型应用是用来让进程在特定的区域中安全的处理信号,即在做具体的操作之前,先把某些特定的信号加入阻塞信号集中,防止在做具体操作过程中被这些信号中断。

prctl函数

prctl函数
Prctl函数(ProcessControl)是Linux系统中一系列应用程序用于控制进程行为的函数集合,它可以帮助用户控制进程的安全性、优先级和内存布局,它是Linux系统编程中设置和查看进程特性的一种方法。

Prctl函数可以用于设置或改变一个进程的属性。

它通常用于设置和改变进程的优先级、设置内存布局、调整安全性条件,以及设定特殊的进程属性,如文件访问控制等。

为了更好地控制单个进程,开发人员还可以使用Prctl函数来获取有关进程的更多信息,例如获取进程的某个标识号、确定当前进程是否有效、查看某个进程的内存布局等。

Prctl函数是Linux系统的内核抽象函数,它可以把某些复杂的行为用一个函数表达出来,具有很高的抽象和方便性,并且可以被调用多次,表达的行为也可以被多个进程共享。

此外,Prctl函数提供了一种可移植的机制,因为不同架构的内核会有不同的实现,开发者可以跨架构和不同版本的Linux系统编写程序。

Prctl函数是Linux系统中一个重要的功能,它可以提供更细粒度的进程控制,有效提高程序的安全性和可靠性。

Prctl函数有很多参数和模式,开发人员可以根据程序的需要来选择合适的参数及适当的模式,以更好地控制进程的行为。

Prctl函数可以很好的满足进程的控制需求,并且它也可以改善应用程序的性能,因为它可以让程序运行的更快、更稳定。

为了更好
地利用Prctl函数,开发人员需要熟悉其原理和知识,以及熟悉Linux 系统和它的行为规则。

只有掌握了这些基本知识,才能正确使用Prctl 函数,为应用程序提供正确有效的控制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档