waitpid()的使用示例是什么?

36

我知道waitpid()函数是用来等待进程结束的,但是如何精确地使用它呢?

这里我的需求是创建两个子进程,等待第一个子进程退出后杀死第二个子进程,再退出。

//Create two children
pid_t child1;
pid_t child2;
child1 = fork();

//wait for child1 to finish, then kill child2
waitpid() ... child1 {
kill(child2) }

2
我注意到在我的Linux系统上,wait(2)手册页包括一个实际的例子,说明如何使用waitpid()系统调用。 - larsks
我认为你可以通过在 SO 上搜索“[c] waitpid”而相对容易地找到答案,但是如果搜索“[c] [waitpid]”,则可能较不容易。我已经用第一个搜索回答了48个问题和第二个搜索回答了5个问题,并且我绝不是唯一回答此类问题的人。 - Jonathan Leffler
3个回答

46

waitpid()的语法:

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

pid的取值可以是:

  • < -1:等待进程组ID等于pid绝对值的任意子进程。
  • -1:等待任意子进程。
  • 0:等待进程组ID等于调用进程ID的任意子进程。
  • > 0:等待进程ID等于pid的子进程。

options的取值是零个或多个以下常量的按位或:

  • WNOHANG:如果没有子进程退出,立即返回。
  • WUNTRACED:如果一个子进程已停止,则也返回。即使未指定此选项,也会提供已停止的被跟踪子进程的状态。
  • WCONTINUED:如果已通过发送SIGCONT恢复了一个已停止的子进程,则也返回。

有关更多帮助,请使用man waitpid


14
https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/waitpid.htm提供了更详细的信息和示例。就我个人而言,从这里对这个问题的两个答案中仍然无法有效地理解如何使用waitpid。 - Colin Keenan

21

语法是

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

1.当pid为子进程时,应该等待它完成。

2.statusPtr是指向存储终止进程状态信息的位置的指针。

3.为waitpid函数指定可选操作。可以指定以下任一选项标志,也可以使用按位包含 OR 运算符进行组合:

WNOHANG WUNTRACED WCONTINUED

如果成功,则waitpid返回报告其状态的终止进程的进程ID。如果失败,则返回-1。

相比于wait的好处

1.当您有多个子进程要处理时,waitpid可以用来等待特定子进程执行完毕后再由父进程继续执行。

2.waitpid支持作业控制。

3.它支持父进程的非阻塞操作。


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

int main (){
    int pid;
    int status;

    printf("Parent: %d\n", getpid());

    pid = fork();
    if (pid == 0){
        printf("Child %d\n", getpid());
        sleep(2);
        exit(EXIT_SUCCESS);
    }

//Comment from here to...
    //Parent waits process pid (child)
    waitpid(pid, &status, 0);
    //Option is 0 since I check it later

    if (WIFSIGNALED(status)){
        printf("Error\n");
    }
    else if (WEXITSTATUS(status)){
        printf("Exited Normally\n");
    }
//To Here and see the difference
    printf("Parent: %d\n", getpid());

    return 0;
}

你是否阅读了关于以下内容的文档:1)waitpid的返回值,2)何时适合使用WEXITSTATE,3)对于WEXITSTATUS,最正常的退出会返回什么? - Antti Haapala -- Слава Україні
3
您能稍微解释一下您的答案吗? - nicolallias
2
非常糟糕的例子,错误处理以及在EINTR上唤醒(经常发生)等问题没有得到处理。 - Lothar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接