linux之进程等待

来源:互联网 发布:淘宝和京东哪个质量好 编辑:程序博客网 时间:2024/06/08 09:04

wait和waitpid函数     

       一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid 获取这些信息,然后彻底清除掉这个进程。

        我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。      

        当一个进程正常或异常终止时,内核就向其父进程发送一个SIGCHLD信号。因为子进程终止是一个异步事件,所以发生这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种 信号的系统默认动作是忽略它。

头文件:#include<sys/types.h>     

#include<sys/wait.h> 

等待函数1:  pid_t wait(int*status);     

返回值:成功返回被等待进程pid,失败返回-1。     

参数: 输出型参数,获取子进程退出状态,不关心则可以设置成为NULL     

如果进程由于接收到SIGCHLD而调用wait,则可期望wait会立即返回。但如果在任意时刻调用wait,则进程可能塞。 在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。 如果status不是一个空指针,则终止进程的终止状态就存放在它所指的单元内。如果不关心终止状态,则可将该参数设为空指针(waitpid同样适用)。 

等待函数2:     pid_t waitpid(pid_t pid, int *status, int options);     

返回值:(1). 当正常返回的时候waitpid返回收集到的⼦子进程的进程ID;         

               (2). 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集, 则返回0;         

               (3). 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;         

               (4). 当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD.     

参数:(1)pid==-1,等待任一个子进程,与wait等效。

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

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

     pid<-1等待其组ID等于pid绝对值的任一子进程。        

   (2)status: WIFEXITED(status)  : 若为正常终止子进程返回的状态,则为真。(查看进程是 否是正常退出)                  WEXITSTATUS(status) : 若WIFEXITED非零,提取子进程退出码。(查看进程 的退出码)       

   (3). options: WNOHANG :若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。 若正常结束,则返回该子进程的ID。                      

           WIFEXITED(status)  : 若为正常终止子进程返回的状态,则为真。             

           WEXITSTATUS(status) : 若WIFEXITED非零,返回子进程退出码,提取进程退出返回值,如果子进程调用exit(7),WEXITSTATUS(status)就会返回7. 

    阻塞式等待代码:


运行结果:


非阻塞式等待代码:

   



  运行结果:


0 0
原创粉丝点击