wait和waitpid函数

  #include <sys/wait.h>

  int wait(int statloc);

  int waitpid(pid_t pid,int *statloc,int option);

                            两个函数返回值:若成功返回进程ID;若出错返回0或-1;

  当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是异步事件,所以这种信号

也是由内核向父进程发送的异步通知。对于这种信号的系统默认动作是忽略它。

  调用wait或waitpid可能会发生:

  . 如果其所有子进程都还在运行,则阻塞。

  . 如果一个进程已经终止,正等待父进程获取其终止状态,则取得子进程的推出状态立即返回。

  . 如果他没有任何子进程,则立即出错返回。

 

  如果一个进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态;否则wait使其调用者阻塞,

直到一个子进程终止。如果调用者阻塞而且他有多个子进程,则在某一子进程终止时,wait立即返回。

  对于waitpid函数中的pid参数的作用解释如下:

   pid==-1   等待任一子进程。这种情况下,waitpid和wait等效

   pid>0      等待进程ID与pid相等的子进程

   pid==0    等待组ID等于调用进程组ID的任一子进程。

   pid<-1    等待进程ID等于pid绝对值的子进程

  option参数使我们进一步控制waitpid的操作,此参数或者是0或是下列的常量按位或运算的结果

    WCONTINUED  若实现支持作业控制,那么有pid指定的任一子进程在听之后继续。但其状态尚未报告,则

              返回其状态

    WNOHANG    若由pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0;

    WUNTRACED  若实现支持作业控制,而由pid指定的任一子进程已处于停止状态,并且其状态自停止以来

             还未报告过,则返回其状态。

  waitpid函数提供了wait函数没有的三个功能:

    1.waitpid可等待一个特定的进程,而wait则返回任一终止进程的状态。

    2.waitpid提供了一个wait的非阻塞版。有时希望获取一个子进程的状态,但不想阻塞

    3.waitpid通过WUNTRACED和WCONTINUED选项支持作业控制

 

wait函数例子:

复制代码
#include "unix.h"
#include <sys/wait.h>
int main()
{
    pid_t pid;
    int stat;

    if((pid=fork())<0)
        printf("fork error\n");
    else if(pid==0)        /*子进程*/
        exit(3);

    if(wait(&stat)!=pid)      /* 父进程阻塞于此,等待子进程终止 */
        printf("wait errorn\n");
    printf("process %d exit code: %d\n",pid,stat);
    
    return 0;
}
复制代码

 

 

waitpid函数例子:

复制代码

void sig_chld(int signo)

{

    pid_t pid;

    int stat;

    while((pid=waitpid(-1,&stat,WNOHANG))>0) /* -1 等待任一子进程,pid进程退出状态保存在stat中,WNOHANG让等待不阻塞调用进程 */

        printf("child %d terminated\n",pid);

    return;

}

 
复制代码

 

  

posted @   撒西不纳拉  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示