#include <sys/types.h> #include <stdio.h> #include <sys/wait.h> void check_exit(int status); main() { pid_t pid; int status; if((pid = fork()) < 0) { printf("fork error!!\n"); exit(0); } else if(pid == 0) { printf("child process exit\n"); exit(0); } else { if(wait(&status) != pid) { printf("wait error!!"); exit(0); } check_exit(status); } } void check_exit(int status) { if(WIFEXITED(status)) printf("eixt\n"); else if(WIFSIGNALED(status)) printf("killed by signal\n"); else if(WIFSTOPPED(status)) printf("stopped by signal\n"); else if(WIFCONTINUED(status)) printf("continued"); }
等待进程改变其状态。所有下面哪些调用都被用于等待子进程状态的改 变,获取状态已改变的子进程信息。状态改变可被认为是:1.子进程已终止。2.信号导致子进程停止执行。3.信号恢复子进程的执行。在子进程终止的情况 下,wait调用将允许系统释放与子进程关联的资源。如果不执行wait,终止了的子进程会停留在"zombie"状态。
如果发现子进程改变了状态,这些调用会立即返回。反之,调用会被阻塞直到子进程状态改变,或者由信号处理句柄所中断(假如系统调用没有通过sigaction的SA_RESTART标志重启动)。
wait 系统调用挂起当前执行中的进程,直到它的一个子进程终止。waitpid挂起当前进程的执行,直到指定的子进程状态发生变化。默认,waitpid只等待 终止状态的子进程,但这种行为可通过选项来改变。waitid系统调用对于等待哪个子进程状态改变提供了更精确的控制。
子进程已终 止,父进程尚未对其执行wait操作,子进程会转入“僵死”状态。内核为“僵死”状态的进程保留最少的信息量(进程标识,终止状态,资源使用信息),过后 父进程执行wait时可以获取子进程信息。只要僵死的进程不通过wait从系统中移去,它将会占据内核进程表中的一个栏位。如果进程表被填满,内核将不能 再产生新进程。如果父进程已终止,它的僵死子进程将由init进程收养,并自动执行wait将它们移去。
wait(等待子进程中断或结束)
#include<sys/types.h> #include<sys/wait.h> pid_t wait (int * status);
函数说明
;wait()会暂时停止目前进程的执行(挂起父进程),直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。如果调用wait的进程没有子进程则会调用失败,子进程的结束状态值请参考 waitpid( )
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。
查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索printf
, include
, 进程
, 结束进程
, 状态
, status
, wait
, 子进程
, 编程控制pid
, fork printf
, 已终止操作
, 等待结束
, 已终止
进程识别码
,以便于您获取更多的相关知识。