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.	}  












你可能感兴趣的:(linux,unix,内核,wait)