wait(等待子进程中断或结束)
表头文件
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明:
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
如果不在意结束状态值,则参数 status 可以设成 NULL。
子进程的结束状态值请参考 waitpid( )
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
pid_t pid1; int status=0;
i=wait(&status);
i返回的是子进程的识别码;PID
status中存的是子进程的结束状态;可用WEXITSTATUS(status)得到子进程的exit(3)的状态,那么就是3;
#include "apue.h"
#include <sys/wait.h>
void pr_exit(int status)
{
if(WIFEXITED(status))
{
printf("normal termination,exit status = %d\n",WEXITSTATUS(status));
}
else if(WIFSIGNALED(status))
{
printf("abnormal termination,signal number = %d%s\n",
WTERMSIG(status),
#ifdef WCOREDUMP
WCOREDUMP(status)? "(core file generated)":"");
#else
"");
#endif
}
else if(WIFSTOPPED(status))
{
printf("child stopped,signal number =%d\n",WSTOPSIG(status));
}
}
int main(void)
{
pid_t pid;
int status;
if((pid=fork())<0)
{
err_sys("fork error");
}
else if(pid==0)
{
//child
exit(7);
}
if(wait(&status)!=pid)
{
err_sys("wait error");
}
pr_exit(status);
if((pid=fork())<0)
{
err_sys("fork error");
}
else if(pid==0)
{
abort();//generates SIGABRT
}
if(wait(&status)!=pid)
{
err_sys("wait error");
}
pr_exit(status);
if((pid=fork())<0)
{
err_sys("fork error");
}
else if(pid==0)
{
//child
status/=0;//generates SIGFPE
}
if(wait(&status)!=pid)
{
err_sys("wait error");
}
pr_exit(status);
exit(0);
}
jiang@AY140524110335068908Z:~/new_apue$ ./a.out
normal termination,exit status = 7
abnormal termination,signal number = 6
abnormal termination,signal number = 8
jiang@AY140524110335068908Z:~/new_apue$