Chinaunix首页 | 论坛 | 博客
  • 博客访问: 867202
  • 博文数量: 82
  • 博客积分: 2283
  • 博客等级: 大尉
  • 技术积分: 2007
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-15 22:19
文章分类

全部博文(82)

文章存档

2012年(82)

分类: LINUX

2012-07-17 11:37:36

#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) |
给主人留下些什么吧!~~