wait,waitpid,waitid————等待进程改变状态
linux中子进程结束时,如果没有调用wait系列的函数时会变成僵死状态。内核会维持僵死进程的部分信息集(PID,结束状态,资源利用信息),用于父进程获取子进程的信息。如果调用父进程终止,处于僵死状态的子进程将被丢弃(init()——自动调用wait)。
linux中子进程结束时,如果没有调用wait系列的函数时会变成僵死状态。内核会维持僵死进程的部分信息(PID,结束状态,资源利用信息),用于父进程随后获取子进程的信息。如果调用父进程终止,处于僵死状态的子进程将被丢弃(init()——自动调用wait)。#include<sys/types.h> #include<sys/wait.h> pid_t wait(int *stauts); pid_t waitpid(pid_t pid,int*stauts,int options);
这些系统调用用于获取子进程状态变化和状态信息。状态的变化可以认为是:(1)子进程终止;(2)子进程被信号中止;子进程被信号唤醒。
当子进程状态变化时,这些系统j调用立即返回。否则将阻塞直到子进程状态改变或信号处理程序(signal handler)中止子进程。
wait()系统调用将阻塞进程直到有子进程终止。wait(&status)等价于:
waitpid(-1,&status,0);
waitpid()系统调用将阻塞进程直到指定的子进程状态改变。默认情况下,waitpid()阻塞到子进程终止,但是可以通过第三个参数options改变等待目标。
第一个参数pid:
<-1 表示等待的子进程组号为pid绝对值。
-1 表示等待任何子进程。
0 表示等待进程组号等于调用进程的任何子进程。
>0 表示等待进程号为pid的子进程。
options的值可以是0也可以是下面的常量:
WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。
WUNTRACED 子进程中止时也返回
WCONTINUED 中止子进程被SIGCONT唤醒时也返回
子进程结束后,状态信息被存放在第二个参数status,这是一个int型指针,可以通过下面宏对结果判别:
WIFEXITED(status) 如果子进程正常终止返回的状态为真。
WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程被信号终止返回的状态为真。
WTERMSIG(status)返回造成子进程终止的信号值,需要在WIFSIGNALED返回值为真的情况下才能使用。
WCOREDUMP(status)如果子进程产生核心转存返回真,这也需要WIFSIGNALED返回值为真时才能使用。并不是所有的UNIX系统都实现了这个宏,使用时需要配合
#ifdef WCOREDUMP
...
#endif
WIFSTOPPED(status)如果子进程没有终止,但停止了并可以重新执行时,该宏返回真。这种情况仅出现在waitpid调用中使用了WUNTRACED选项。
WSTOPSIG(status)如果WIFSTOPPED(status)返回真,该宏返回导致子进程停止的信号(signal)值。
waitid():
waitid()系统调用用于获取更精细的子进程状态的变化信息,执行成功或者指定了WNOHANG,但是id所指的子进程状态没有发生改变时返回0;出错返回-1。
idtype和id指定等待的子进程或多个子进程,如下:int waitid(idtype_t idtype,id_t id,siginfo_t*infop,int options);
idtype=P_PID:等待指定进程号的子进程。
idtype=P_PGID:等待指定进程组号的所有子进程。
idtype==P_ALL:等待所有子进程。
options的值可以为如下几个的或操作组合:
- WEXITED:等待那些已经终止的子进程
- WSTOPPED:等待那些被信号暂停的子进程
- WCONTINUED:等待那些由SIGCONT重新启动的子进程
- WNOHANG:同wiatpid中的
- WNOWAIT:从处于”可等待状态“的子进程返回,但是后面的wait还可以获取子进程的状态
如果infop不为NULL,则档waitid成功返回时,这个结构将会被填写,我们可以从该结构中获取我们感兴趣的信息,其中有:
- si_pid: 子进程的进程id
- si_uid:子进程的真实用户id
- si_signo:总是设置为SIGCHID
- si_status:要么是子进程的返回状态,要么是造成子进程状态改变的信号,si_code说明如何来解释这个域
更多推荐
所有评论(0)