wait 和 waitpid 差别

 1、一个进程正常结束:

(1)return

(2)exit

(3)_exit和_Exit

(4)进程的最后一个线程使用return

(5)进程的最后一个线程使用phread_exit

2、一个异常进程结束:

(1)abort

(2)signal

(3)cancellation request ,最后一个线程被取消

3、当一个进程结束时,它的父进程需要知道它是如何结束的,于是需要得到子进程的termination status,parent process可以通过wait 和waitpid两个函数得到。

(1)当parent process 先于child process结束

init process(ID is 1)接手它的child process,kernel搜索所有的进程,看看结束的进程是否是正在运行的进程的父进程,如果是,则将它们的父进程改为init process。

(2)子进程先于父进程结束

kernle保留了所有将要结束的进程的信息,如:process ID,termnation status,a mount of CPU time,这样的话,parent process可以通过wait和waitpid得到termination status。

(3)当一个进程的父进程变成init process时,发生了什么?

无论何时child process结束,init调用wait函数得到termination status。init进程总是可以获得子进程的终止状态

4、wait和waitpid

(1)当调用这两个函数时,可能发生三种情况

        (1)block——如果它的子进程全部都在运行。
        (2)立即返回child process的termination status——如果有子进程终止。

        (3)返回error——如果没有子进程。 

# include <sys/wait.h>

pid_t    wait (int   *statloc);

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

(2)两者的区别

        (1)wait可能阻塞caller直到一个子进程终止,而waitpid则可以通过选项不会阻塞。

        (2)waitpid并不等待第一个终止的进程,它有选项可以控制它所等待的进程。

(3)对于得到的ternimation status我们可以通过四个macos来区分:

         (1)WIFEXITED(status)  //正常终止

         (2)WIFSIGNALED(status)  //异常终止,获取异常信号

         (3)WIFSTOPPED(status)

         (4)WIFCONTINUED(status)

(4)waitpid根据pid的不同来获取不同的进程termination status。

         (1)waitpid可以wait某个特定的process,而wait则是任何的terminated child

         (2)waitpid是nonblockling  //可以使用选项控制为非阻塞

         (3)waitpid支持WUNTRACED和WCONTINUED    //waitpid支持任务控制

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值