waitpid

等待进程中断或结束

头文件

#include < sys/wait.h >

函数原型

pid_t waitpid(pid_t pid, int *status, int options)

函数说明

waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用waitpid()时子进程已经结束,则waitpid()会立即返回子进程结束状态值。

子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。

参数pid为欲等待的子进程识别码,其他数值意义如下:

  • pid<-1 等待进程组识别码为pid绝对值的任何子进程。
  • pid==-1 等待任何子进程,相当于wait()。
  • pid=0 等待进程组识别码与目前进程相同的任何子进程。
  • pid>0 等待任何子进程识别码为pid的子进程。

参数option可以为0 或下面的OR 组合

  • WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。
  • WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会

返回值

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

范例

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

    pid_t pid;

    pid = fork();

    if(pid < 0) {
        perror("fork");
        return -1;
    } else if(pid == 0) {
        int i;
        for(i=0; i< 5; i++){
            printf("this is the child\n");
            sleep(1);
        }
        exit(3);
    } else {
        int status;
        waitpid(0, &status, 0);
        if(WIFEXITED(status)) {
            printf("child exited with code %d\n", WEXITSTATUS(status));
        } else if(WIFSIGNALED(status)) {
            printf("child terminated abnormally, signal %d\n", WTERMSIG(status));
        }
    }
    return 0;
}

执行

[root@iz2zecj7a5r32f2axsctb9z process]# ./waitpid
this is the child
this is the child
this is the child
this is the child
this is the child
child exited with code 3
文档更新时间: 2021-03-06 00:19   作者:周国强