Linux学习记录–进程控制相关系统调用

系统调用:进程控制fork系统调用

函数作用:创建一个子进程

形式:pid_tfork(void);

pid_t vfork(void);

说明:使用vfork创子进程时,不会进程父进程的上下文

返回值:[返回值=-1]子进程创建失败

[返回值=0]子进程创建成功

[返回值>0]对父进程返回子进程PID

#include <stdio.h>#include <sys/stat.h>#include <unistd.h>int main() {pid_t id = fork();if (id < 0) {perror(“子进程创建失败!”);} else {if (id == 0) {printf(“子进程工作:PID=%d,PPID=%d\n”, getpid(), getppid());}else{printf(“父进程工作:PID=%d,PPID=%d,子进程PID=%d\n”, getpid(), getppid(),id);sleep(5)}}}

子进程工作:PID=3176,PPID=3173

exit系统调用

函数作用:终止发出调用的进程

形式:voidexit(int status);

说明

1. exit返回信息可由wait系统函数获得

2. 如果父进程先退出子进程的关系被转到init进程下

#include <stdio.h>#include <sys/stat.h>#include <unistd.h>#include <stdlib.h>int main() {pid_t id = fork();if (id < 0) {perror(“子进程创建失败!”);} else {if (id == 0) {printf(“子进程工作:PID=%d,PPID=%d\n”, getpid(), getppid());sleep(20);printf(“此时子进程:PID=%d,PPID=%d\n”, getpid(), getppid());}else{printf(“父进程工作:PID=%d,PPID=%d,子进程PID=%d\n”, getpid(), getppid(),id);sleep(5);exit(3);}}return 0;}

wait系统调用

函数作用:父进程与子进程同步,父进程调用后。进入睡眠状态,直到子进程结束或者父进程在被其他进程终止,

形式:pid_twait(int *status)

pid_t waitpid(pid_t pid ,int *status,int option)

参数:statusè exit是设置的代码

pid è进程号

option: WNOHANG|WUNTRACED

WNOHANG:,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去.WUNTRACED:子进程进入暂停则马上返回,但结束状态不予以理会.

返回值:如果成功等待子进程结束,则返回子进程PID。后者为-1

用来检查子进程返回状态的宏

WIFEXITED这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值.

WEXITSTATUS当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值

wait函数使用#include <sys/types.h>#include <sys/uio.h>#include <string.h>#include <fcntl.h>#include <unistd.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>int main() {pid_t cid;cid = fork();if (cid < 0) {perror(“子进程创建失败!”);} else {if (cid == 0) {printf(“子进程工作\n”);printf(“子进程PID=%d,PPID=%d\n”, getpid(),getppid());//sleep(20); //1} else {//wait(NULL);//2//sleep(20);//3printf(“父进程工作\n”);printf(“父进程PID=%d,PPID=%d\n”, getpid(),getppid());}}return 0;}

[root@localhostDebug]# ps -C Process -o pid,ppid,stat,cmd

PID PPID STAT CMD

1250611563 S /root/workspace/Process/Debug/Process

父进程工作

父进程PID=12506,PPID=11563

WEXITSTATUS与WIFEXITED宏的使用#include <sys/types.h>#include <sys/uio.h>#include <fcntl.h>#include <unistd.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>int main() {pid_t cid;int pr, status;cid = fork();if (cid < 0) {perror(“子进程创建失败!”);} else {if (cid == 0) {printf(“子进程工作PID=%d,父进程PID=%d\n”, getpid(),getppid());sleep(20);exit(3);} else {pr = wait(&status);if (WIFEXITED(status)) {printf(“父进程工作PID=%d\n”, getpid());printf(“WAIT返回值=%d\n”, pr);printf(“子进程正常退出PID=%d\n”, getpid());printf(“WIFEXITED(status)=%d\n”, WIFEXITED(status));printf(“WEXITSTATUS(status)=%d\n”, WEXITSTATUS(status));} else {printf(“子进程异常退出PID=%d,信号=%d\n”, getpid(), status);printf(“WAIT返回值=%d\n”, pr);}}}return 0;}

基于上面代码做出分析:

1. 子进程正常退出

控制台输出信息如下:

子进程工作PID=12070,父进程PID=12069

(20S后…..)

父进程工作PID=12069

WAIT返回值=12070

子进程正常退出PID=12069

WIFEXITED(status)=1

WEXITSTATUS(status)=3

2. 子进程异常退出

作法:

运行程序,在子进程SLEEP期间,杀死子进程

[root@localhost Debug]# kill -9 11990

控制台台输出如下

子进程工作PID=11990,父进程PID=11985

(kill -9 PID 杀死子进程)

子进程异常退出PID=11985,信号=9

可以看出子进程正常退出时,,status返回值是exit的退出值,子进程异常退出时status返回值信号值

waitpid函数使用

waitpid的参数说明

参数pid的值有以下几种类型:pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去.pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样.pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬.pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值.

勇于接受自己的不完美,认清自己不足的地方,

Linux学习记录–进程控制相关系统调用

相关文章:

你感兴趣的文章:

标签云: