关于fork()

bryantism 2009-11-21 12:48:00
最近看到了fork函数,发现在调用多个fork时,绕不过来,请教


#include<stdlib.h>
#include<stdio.h>
#include<sys/wait.h>
int main()
{
pid_t pid;
if((pid=fork())<0)
printf("error");
else if(pid==0) /* child 1 */
{
if((pid=fork())<0)
printf("error");
else if(pid>0)
{
printf("hell\n");
}

sleep(2);
printf("second child,parent pid=%d\n",getppid());
exit(0);
}
if(waitpid(pid,NULL,0)!=pid)
printf("error");
exit(0);

}

这个的输出为
hell
second child,parent pid=15180
second child,parent pid=15179

而把这段代码稍微改一下
#include<stdlib.h>
#include<stdio.h>
#include<sys/wait.h>
int main()
{
pid_t pid;
if((pid=fork())<0)
printf("error");
else if(pid==0) /* child 1 */
{
if((pid=fork())<0)
printf("error");
else if(pid>0)
{
exit(0);
}

sleep(2);
printf("second child,parent pid=%d\n",getppid());
exit(0);
}
if(waitpid(pid,NULL,0)!=pid)
printf("error");
exit(0);

}

而这段代码就变成了 second child,parent pid=1

这是什么原因,有谁能帮我把上面这两端代码解释下谢谢

...全文
100 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bryantism 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 starwalker 的回复:]
要理解fork,必须先理解fork的返回值。
RETURN VALUE
      Upon successful completion, fork() shall return 0 to the child  process
      and shall return the process ID of the child process to the parent pro-
      cess. Both processes shall continue to execute from  the  fork()  func-
      tion.  Otherwise,  -1 shall be returned to the parent process, no child
      process shall be created, and errno shall be set to indicate the error.


[/Quote]
这个我知道的。但是您能给我解释下第2个例子中else if(pid>0)
{
exit(0);
}
后,从哪儿开始继续执行么?
starwalker 2009-11-21
  • 打赏
  • 举报
回复
要理解fork,必须先理解fork的返回值。
RETURN VALUE
Upon successful completion, fork() shall return 0 to the child process
and shall return the process ID of the child process to the parent pro-
cess. Both processes shall continue to execute from the fork() func-
tion. Otherwise, -1 shall be returned to the parent process, no child
process shall be created, and errno shall be set to indicate the error.

starwalker 2009-11-21
  • 打赏
  • 举报
回复
第二例中的
else if(pid>0)
{
exit(0);
}

首先,这段代码之前需要经过第一个fork之后的else if(pid==0)判断。
这个判断如果pid==0,则表示是第一个子进程,因此上述代码段只在第一个子进程中执行。
再看上面的代码段,else if(pid>0)判断第二个fork返回值,第二个fork实在第一个子进程中执行的,因此pid>0表示是第一个子进程,pid==0表示第一个子进程的子进程。
当pid>0成立时,必定是在第一个子进程中,于是第一个子进程exit了。
phpjspasp 2009-11-21
  • 打赏
  • 举报
回复
看看APUE
bryantism 2009-11-21
  • 打赏
  • 举报
回复
唉。。。
z0203153008 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bryantism 的回复:]
引用 8 楼 z0203153008 的回复:
引用 6 楼 bryantism 的回复:
引用 4 楼 z0203153008 的回复:
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。

唔。。。
把sleep(2)拿掉就变了,看来我还没理解sleep是啥意思。看的apue,还没看到具体sleep的用法

不是sleep的问题,问题是fork()后子进程和父进程是交替执行的,不一定子进程先执行。


谢谢了。
[/Quote]
不谢 -_-
bryantism 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 z0203153008 的回复:]
引用 6 楼 bryantism 的回复:
引用 4 楼 z0203153008 的回复:
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。

唔。。。
把sleep(2)拿掉就变了,看来我还没理解sleep是啥意思。看的apue,还没看到具体sleep的用法

不是sleep的问题,问题是fork()后子进程和父进程是交替执行的,不一定子进程先执行。
[/Quote]

谢谢了。
z0203153008 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bryantism 的回复:]
引用 4 楼 z0203153008 的回复:
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。

唔。。。
把sleep(2)拿掉就变了,看来我还没理解sleep是啥意思。看的apue,还没看到具体sleep的用法
[/Quote]
不是sleep的问题,问题是fork()后子进程和父进程是交替执行的,不一定子进程先执行。
z0203153008 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bryantism 的回复:]
引用 4 楼 z0203153008 的回复:
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。

哦,这样。
我想说的是会不会先执行孙进程?
[/Quote]
你在pid>0里面sleep个四五秒试试。
bryantism 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 z0203153008 的回复:]
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。
[/Quote]
唔。。。
把sleep(2)拿掉就变了,看来我还没理解sleep是啥意思。看的apue,还没看到具体sleep的用法
bryantism 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 z0203153008 的回复:]
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。
[/Quote]
哦,这样。
我想说的是会不会先执行孙进程?
z0203153008 2009-11-21
  • 打赏
  • 举报
回复
应为大于0的时候exit了,所以子进程已经结束了,孙进程的父进程变成了init,就是pid为1的进程。所以getppid()就是1了。
2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bryantism 的回复:]
这个我知道的。但是您能给我解释下第2个例子中else if(pid>0)
{
exit(0);
}
后,从哪儿开始继续执行么?
[/Quote]
都 exit 了,还谈什么执行~~

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧