我知道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
的取值是零个或多个以下常量的按位或:
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 WCONTINUED
如果成功,则waitpid返回报告其状态的终止进程的进程ID。如果失败,则返回-1。
相比于wait的好处
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;
}
waitpid
的返回值,2)何时适合使用WEXITSTATE
,3)对于WEXITSTATUS
,最正常的退出会返回什么? - Antti Haapala -- Слава Україні
wait(2)
手册页包括一个实际的例子,说明如何使用waitpid()
系统调用。 - larsks