34

我知道这waitpid()是用来等待一个过程完成的,但是如何准确地使用它呢?

这里我想做的是,创建两个孩子并等待第一个孩子完成,然后在退出之前杀死第二个孩子。

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

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

3 回答 3

42

的语法waitpid()

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

的值pid可以是:

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

options 的值是以下常量中的零个或多个的 OR:

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

如需更多帮助,请使用man waitpid.

于 2014-01-21T04:17:28.420 回答
21

语法是

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

1.其中 pid 是它应该等待的子进程。

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

3.指定waitpid函数的可选动作。可以指定以下选项标志中的任何一个,或者可以将它们与按位包含 OR 运算符组合:

WNOHANG WUNTRACED W继续

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

等待的好处

1.Waitpid 可以在您有多个子进程并且您希望等待特定子进程在父进程恢复之前完成其执行时使用

2.waitpid支持作业控制

3.支持父进程不阻塞

于 2014-01-21T05:18:06.800 回答
3
#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;
}
于 2019-05-21T11:56:40.150 回答