#include
#include
#include
#include
#include
int main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf("fork program starting\n");
pid = fork();
switch(pid)
{
case -1:
exit(1);
case 0:
message = "This is the child";
n = 5;
exit_code = 37;
break;
default:
message = "This is the parent";
n = 3;
exit_code = 0;
break;
}
for(; n > 0; n--) {
puts(message);
sleep(1);
}
if(pid) {
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("Child has finished: PID = %d\n", child_pid);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
else
printf("Child terminated abnormally\n");
}
exit (exit_code);
每个进程结束后(比如 exit(code) 后),操作系统不会马上把这个进程的记录从进程表中删掉,
而是会保留进程的一些状态信息,其中就包括 exit_code,这个进程的父进程应该通过 wait,
waitpid之类的系统调用获取这个进程的状态信息,随后操作系统才会从进程表中删除这个结束进程的记录。
所以,你不能从纯 C 语言的角度去理解 “程序是怎么把exit_code传给stat_val这个变量的”,
这是操作系统提供的系统调用接口 wait 实现的。
子进程运行结束时会向父进程发送一个SIGCHLD信号 ,wait函数就是等待SIGCHLD信号,如果收到SIGCHLD信号,
他就会读取子进程相关的控制数据,并修改stat_val,你可以看到wait函数的参数是传递地址的。
WEXITSTATUS只是一个宏定义,判断stat_val的值是不是exit_code,他不是函数的。
阅读(1264) | 评论(0) | 转发(0) |