当前位置: 技术问答>linux和unix
关于wait函数
来源: 互联网 发布时间:2017-01-05
本文导语: 为什么第一个子进程exit了,父进程仍然挂起呢? #include #include #include #include #include int main() { pid_t pid; char *message; int n; int exit_code; printf("fork program startingn"); pid = fork(); switch(pid) { case -1: perror("f...
为什么第一个子进程exit了,父进程仍然挂起呢?
#include
#include
#include
#include
#include
int main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf("fork program startingn");
pid = fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:// first child
message = "child";
n = 1;
exit_code = 37;
pid = fork();// second child
if(pid == 0){
message = "grandson";
n = 8;
exit_code = 38;
}
break;
default:
message = "parent";
n = 3;
exit_code = 0;
break;
}
for(; n>0; n--) {
puts(message);
sleep(1);
}
if(pid != 0){
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("child has finished: PID = %dn", child_pid);
if(WIFEXITED(stat_val))
printf("child exited with code %dn", WEXITSTATUS(stat_val));
else
printf("child terminated abnormallyn");
}
exit(exit_code);
}
|
你说的第一个子进程是哪个?
程序应该改是这样运行:
parent:fork(child), sleep(3), wait(child).
child : fork(grandson), sleep(1), wait(grandson).
grandson: sleep(8).
应为3个进程都有sleep,无需考虑竞争条件。
1.child进程首先进入wait(grandson) 挂起。
2.parent进程进入wait(child)挂起。
3.grandson进程执行完, 唤醒child进程,
4.child进程唤醒后执行完,唤醒parent进程。
5.parent进程执行完,程序退出。
程序应该改是这样运行:
parent:fork(child), sleep(3), wait(child).
child : fork(grandson), sleep(1), wait(grandson).
grandson: sleep(8).
应为3个进程都有sleep,无需考虑竞争条件。
1.child进程首先进入wait(grandson) 挂起。
2.parent进程进入wait(child)挂起。
3.grandson进程执行完, 唤醒child进程,
4.child进程唤醒后执行完,唤醒parent进程。
5.parent进程执行完,程序退出。