wait waitpid

当一个进程终止之后,内核向父进程发送一个SIGCHLD。默认这个信号被忽略,进程可以通过singnal()或者sigaction()系统调用来处理这个信号。父进程希望得到子进程终止的更多信息,比如返回值,甚至显式的等待这个事件的到来,这就是wait或者waitpid,它们可以做: 
1)阻塞,如果子进程仍然在执行。
2)立即返回,包含子进程的终止状态,如果一个子进程终止,等待它的终止状态被获取。
3)返回错误,如果它没有子进程。

pid_t wait(int *statloc); 
pid_t waitpid(pid_t pid, int *statloc, intoptions);

wait会阻塞调用者,直到一个子进程终止,而waitpid有一个设置不阻塞的选项

1.	#include <sys/wait.h>  
2.	  
3.	int WIFEXITED(status);  //子进程正常结束
4.	int WIFSIGNALED(status);  //被异常终止
5.	int WIFSTOPPED(status);  //被暂停
6.	int WIFCONTINUED(status);  //继续运行时
7.	  
8.	int WEXITSTATUS(status);  //获取正常结束时的返回值
9.	int WTERMSIG(status);    //获取异常终止信号
10.	int WSTOPSIG(status);  //获取引起子进程暂停的信号
11.	int WCOREDUMP(status);  //获取子进程异常终止所产生的内核文件
WIFEXITED:如果子进程正常终止,返回true。可以通过WEXITSTATUS得到参数的低8位。
WIFSIGNALED:
如果是信号导致子进程不正常终止,返回true。可以通过WTERMSIG返回信号的号。
一些UNIX实现定义了WCOREDUMP宏,如果进程dump core来响应信号。
WIFSTOPPED:
如果进程被停止,返回true,通过WSTOPSIG来获得导致子进程停止的信号。
WIFCONTINUED
:如果状态是由已经被continued子进程返回,返回true


1.	#include <unistd.h>  
2.	#include <stdio.h>  
3.	#include <sys/types.h>  
4.	#include <sys/wait.h>   
5.	  
6.	int main(void){  
7.	    int status;  
8.	    pid_t pid;  
9.	      
10.	    if(! fork()){  
11.	        return 1;  
12.	    }  
13.	  
14.	    pid = wait(&status);  
15.	    if(pid == -1)  
16.	        perror("wait");  
17.	    printf("pid=%d\n",pid);  
18.	  
19.	    if(WIFEXITED(status))  
20.	        printf("Normal termination with exit status=%d\n",WEXITSTATUS(status));  
21.	    if(WIFSIGNALED(status))  
22.	        printf("Killed by signal=%d%s\n",WTERMSIG(status),WCOREDUMP(status));  
23.	    if(WIFSTOPPED(status))  
24.	        printf("Stopped by signal=%d\n",WSTOPSIG(status));  
25.	    if(WIFCONTINUED(status))  
26.	        printf("Continued\n");  
27.	  
28.	    return 0;  
29.	}  

waitpid

pid参数指定了要等待的进程id
< -1
:等待任意一个绝对值和进程group id相等的进程。
-1
:等待任意一个子进程,和wait一样
0
:等待和当前进程相同组的任一子进程。
> 0:
等待该进程id的子进程
option
可以通过OR连接下列选项:
WNOHANG
:不阻塞,如果没有匹配的子进程也直接返回。
WUNTRACED
:如果被设置,WIFSTOPPED也会被设置。允许更一般的作业控制。
WCONTINUED
:如果被设置,WIFCONTINUED也被设置。和WUNTRACED一起,

1.	int status;  
2.	pid_t pid;  
3.	pid = waitpid (1742, &status, WNOHANG);  
4.	if (pid == -1)  
5.	    perror ("waitpid");  
6.	else {  
7.	    printf ("pid=%d\n", pid);  
8.	    if (WIFEXITED (status))  
9.	        printf ("Normal termination with exit status=%d\n",WEXITSTATUS (status));  
10.	    if (WIFSIGNALED (status))  
11.	        printf ("Killed by signal=%d%s\n",WTERMSIG (status),WCOREDUMP (status) ? " (dumped core)" : "");  
12.	}  












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值