进程等待

来源:互联网 发布:东方购物软件 编辑:程序博客网 时间:2024/06/09 13:44

进程等待——可以是进程组成员的等待,也可以是父进程对子进程的等待。

当一个进程结束时,Linux将产生一个SIGCHLD信号通知其父进程。在父进程未查询到子进程的结束原因时,该子进程虽然停止了,但是并没有结束,这个时候的这个进程被称为zombie process(僵尸进程)。这个时候就需要使用进程等待的系统调用(wait / waitpid)

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid,int *status,int options);

wait----用于等待子进程,参数status是一个整数指针,当子进程结束时,将子进程的结束状态字存放在该指针指向的缓冲区。调用wait时,父进程将会被挂起,直至该进程的一个子进程结束,该调用才会返回。如果调用wait的进程没有子进程,该调用就会失败。如果调用成功时,返回值就是等待状态的PID;调用失败的时候,返回值是-1.

waitpid---waitpid的调用要比wait灵活一些,它可以用来等待指定的一个进程,可以使进程不挂起而立刻返回。参数pid用于指定所等待的进程。参数option用于指定进程所做的操作,它可以取 0(表示将进程挂起等待其结束) /WNOHANG(表示不使进程挂起而立刻返回) /WUNTRACEO(表示如果进程已结束则返回)

调用waitpid   pid的取值

pid取值                        含义

pid>0 等待进程ID为pid所指定值的子进程

pid=0 等待进程组ID等于发出调用进程的进程组ID的子进程

pid=-1 等待所有子进程(相当于wait调用)

pid<-1 等待进程组ID为pid的绝对值的子进程(|-1| /|1|)

参数status不为NULL时,若函数成功返回,则将子进程的结束状态字存放在status所指向的缓冲区中(利用该状态字,则可以使用Linux系统定义的宏来了解子程序结束的原因)

WIOFEXITED(status)---子进程正常结束时,返回值为真。

WIFSIGNALED(status)---子进程接收到信号结束时,返回值为真;如果进程接收到信号调用时调用exit函数结束,则返回值为假。

WIFSTOPPED---在调用函数waitpid时设定了WUNTRACEO选项,且该子进程使waitpid返回时,这个宏返回值为真。

WSTOPSIG---当WIFSTOPPED的返回值为真时,该宏返回停止该进程的信号的值。

WTERMSIG---当WIFSGNALED的返回值为真时,该宏返回终止该进程的信号的值。

WEXITSTATUS---当WIFEXITED的返回值为真时,这个宏才可以使用,该宏返回由子进程调用-exit(status)或exit(status)时设置的调用参数status.

函数wait3和wait4(相当于wait和waitpid,只是多了一个参数rusage,该参数是一个结构指针,调用这两个指针时,如果rusage不为NULL,则关于子进程执行时的相关信息被写入指针指向的缓冲区内)

#define _USE_BSD

#include<sys/types.h>

#include<sys/resource.h>

#include<sys/wait.h>

pid_t wait3(int *status,int options,struct rusage *rusage);

pid_t wait4(pid_t pid,int *status,int options,struct rusage *rusage);

0 0