我知道这waitpid()
是用来等待一个过程完成的,但是如何准确地使用它呢?
这里我想做的是,创建两个孩子并等待第一个孩子完成,然后在退出之前杀死第二个孩子。
//Create two children
pid_t child1;
pid_t child2;
child1 = fork();
//wait for child1 to finish, then kill child2
waitpid() ... child1 {
kill(child2) }
我知道这waitpid()
是用来等待一个过程完成的,但是如何准确地使用它呢?
这里我想做的是,创建两个孩子并等待第一个孩子完成,然后在退出之前杀死第二个孩子。
//Create two children
pid_t child1;
pid_t child2;
child1 = fork();
//wait for child1 to finish, then kill child2
waitpid() ... child1 {
kill(child2) }
的语法waitpid()
:
pid_t waitpid(pid_t pid, int *status, int options);
的值pid
可以是:
pid
。pid
。options 的值是以下常量中的零个或多个的 OR:
WNOHANG
:如果没有孩子退出,则立即返回。WUNTRACED
: 如果孩子停止了也返回。即使未指定此选项,也会提供已停止的跟踪子项的状态。WCONTINUED
:如果停止的孩子已经通过交付恢复,也返回SIGCONT
。如需更多帮助,请使用man waitpid
.
语法是
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.支持父进程不阻塞
#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;
}