天天看点

函数wait和waitpid进程终止信号wait与waitpid区别wait与waitpid作用wait()waitpid()

进程终止信号

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

wait与waitpid区别

  • 在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞;
  • waitpid并不等待在其调用之后的第一个终止的子进程,它有若干个选项,可以控制它所等待的进程;

wait与waitpid作用

父进程要调用wait或waitpid对结束(或被kill掉)的子进程进行回收,否则子进程将变成僵尸进程。

wait()

返回值:

成功结束运行的子进程的进程号;

失败返回-1;

参数:

status如果不是一个空指针,则终止进程的终止状态就存放在statloc所指向的单元;

status如果是一个空指针,则表示父进程不关心子进程的终止状态;

waitpid()

参数:

pid>0 只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出
pid=-1 等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样
pid=0 等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬
pid<-1 等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值
  • status如果不是一个空指针,则终止进程的终止状态就存放在status所指向的单元。;
  • status如果是一个空指针,则表示父进程不关心子进程的终止状态;

option

WNOHANG 若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0
WUNTRACED 返回终止子进程信息和因信号停止的子进程信息
WCONTINUED 返回收到SIGCONT信号而恢复执行的已停止子进程状态信息

返回值:

成功 返回结束运行的子进程的进程号
失败 返回-1
WNOHANG 没有子进程退出返回0

继续阅读