C语言控制进程之进程等待详解
什么是进程等待
进程等待是指程序在执行过程中,等待子进程结束并获取子进程的退出状态,以便对进程执行状态进行处理。
进程等待函数
进程等待函数是
pid_t wait(int *status)
wait()函数会等待任意一个子进程,获取子进程的退出状态并存储到status指向的整型变量中,返回结束的子进程ID。
pid_t waitpid(pid_t pid, int *status, int options)
waitpid()函数可以等待指定PID的子进程,获取子进程退出状态并存储到status指向的整型变量中,同时还可以通过options参数指定不同的等待方式。
进程等待示例
下面我们将通过两个示例来演示进程等待的使用。
示例1
下面是一个简单的fork()及wait()示例,父进程会等待子进程结束并获取子进程的退出状态。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid;
if((pid = fork()) < 0) {
perror("fork error");
exit(1);
}
else if(pid == 0) {
// 子进程执行的代码
printf("This is child process %d\n", getpid());
exit(0);
}
else {
int status;
if(wait(&status) != pid) {
perror("wait error");
exit(1);
}
if(WIFEXITED(status))
printf("Child process %d exited with code %d\n", pid, WEXITSTATUS(status));
}
return 0;
}
运行结果:
This is child process 23625
Child process 23625 exited with code 0
示例2
下面是一个waitpid()示例,利用waitpid()函数可以等待指定PID的子进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid1, pid2, pid3;
if((pid1 = fork()) < 0) {
perror("fork error");
exit(1);
}
else if(pid1 == 0) {
// 子进程1执行的代码
printf("This is child process 1, pid = %d\n", getpid());
exit(1);
}
else {
if((pid2 = fork()) < 0) {
perror("fork error");
exit(1);
}
else if(pid2 == 0) {
// 子进程2执行的代码
printf("This is child process 2, pid = %d\n", getpid());
exit(2);
}
else {
if((pid3 = fork()) < 0) {
perror("fork error");
exit(1);
}
else if(pid3 == 0) {
// 子进程3执行的代码
printf("This is child process 3, pid = %d\n", getpid());
exit(3);
}
else {
int status;
// 等待子进程2结束并获取退出状态
if(waitpid(pid2, &status, 0) == pid2 && WIFEXITED(status))
printf("Child process %d exited with code %d\n", pid2, WEXITSTATUS(status));
}
}
}
return 0;
}
运行结果:
This is child process 1, pid = 23626
This is child process 2, pid = 23627
This is child process 3, pid = 23628
Child process 23627 exited with code 2
参考
- 《UNIX网络编程:卷1,套接字联网API》
- 《深入理解计算机系统(原书第3版)》
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言控制进程之进程等待详解 - Python技术站