等待进程结束
# 等待进程结束
# 等待进程结束
wait函数族最重要的两个函数是wait和waitpid函数
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait (int * status);
pid_t waitpid(pid_t pid, int* status, int options);
1
2
3
4
2
3
4
- waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束,并收集子进程的资源。如果在调用waitpid时子进程已经结束,则waitpid会立即返回子进程结束状态值。子进程的结束状态值由参数status返回,而子进程的进程号也会一并返回。如果执行成功则返回子进程号(PID),如果有错误发生则返回-1。失败原因存于errno中。
# waitpid函数参数
pid_t waitpid(pid_t pid, int* status, int options);
1
pid:欲等待的子进程号
status:保存子进程的结束状态
option:可以为0或下面的OR组合:
- WNOHANG 如果没有任何已经结束的子进程则马上返回
- WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
# 示例代码
等待子进程结束
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t child;
int status, child_pid;
if((child = fork()) == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if(child == 0) {
puts("in child");
printf("\tchild pid = %d\n", getpid());
printf("\tchild ppid = %d\n", getppid());
// getchar();
exit(EXIT_SUCCESS);
} else { /* Wait for the child to exit */
child_pid = waitpid(child, &status, 0);
printf("in parent\n");
printf("\tparent pid = %d\n", getpid());
printf("\tchild exited with %d\n", status);
printf("\tchild pid is %d\n", child_pid);
// getchar();
}
exit(EXIT_SUCCESS);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 子进程正常结束
执行结果
$ ./waitpid
in child
child pid = 2731
child ppid = 2730
in parent
parent pid = 2730
child exited with 0
child pid is 2731
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
子进程先执行,父进程等待子进程完成。
子进程正常退出,status为0。
父进程通过waitpid函数返回值获得子进程的进程号。
# 子进程异常退出
打开上述代码的两个getchar注释,父子进程都会等待字符输入。
按下面步骤
- 执行
./waitpid
- 新开一个终端,执行
ps -aux
查看所有进程,找到waitpid对应的父子进程 - 杀死子进程,
kill -9 子进程ID
- 查看输出
# 终端1
$ ./waitpid
in child
child pid = 2738
child ppid = 2737
1
2
3
4
5
6
2
3
4
5
6
# 终端2
$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 2737 0.1 0.0 10416 440 tty4 S 21:40 0:00 ./waitpid
user 2738 0.0 0.0 10548 380 tty4 S 21:40 0:00 ./waitpid
1
2
3
4
5
2
3
4
5
# 终端2
$ kill -9 2738
1
2
2
# 终端1
$ ./waitpid
in child
child pid = 2738
child ppid = 2737
in parent
parent pid = 2737
child exited with 9
child pid is 2738
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
child exited with 9
,status为9。
编辑 (opens new window)
上次更新: 2023/02/18, 10:09:42
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05