请教:创建守护进程的代码中,一句迷惑(没分了,实在抱歉):

benbenxiaoluchi 2008-10-13 01:22:20
int main(int argc,char * argv[])
{
......
......
BackGroundSvr();/*此方法创建守护进程*/
......
......
//main函数继续作很多处理
......

}


int BackGroundSvr( void )
{
pid_t pidSub;
pidSub = fork();
if ( pidSub<0 )
exit( 1 );
else if ( pidSub > 0 )
{
exit( 0 ); //请问在这句里面, exit(0)后,父进程不是退出了吗?? 为什么main函数在调用了BackGroundSvr后,下面还有很多处理的工作, 下面那些代码怎么能执行得到呢?? 难道exit后,main还能够继续往下运行。
}
else
{
setsid();
/*chdir( "/" );*/
umask( 0 );
}

return 0;
}

...全文
132 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlabing 2008-10-14
  • 打赏
  • 举报
回复
把fork相关知识看看,fork后发生了些什么事件。
你可以这样简单的理解:一头黄牛(称为甲),对它fork后(可以理解为用克隆技术),产生了另一头牛(称为乙)。在某一时刻甲牛死掉了,乙牛也要会一起死掉吗?
快乐田伯光 2008-10-14
  • 打赏
  • 举报
回复
所以先别谈什么守护进程,你还是先把基本的东西fork()搞清楚再说, fork()后产生了两个进程,你只是在一个进程里调用了exit,所以这个进程会退出,而另一个进程会继续执行下去。

[Quote=引用 12 楼 benbenxiaoluchi 的回复:]
引用 9 楼 guosha 的回复:
不调exit会继续执行后面的代码,而调用exit进程就退出了。
先把进程的基本东西搞清楚再谈守护进程。

您的意思, 我main中调用BackGroundSvr 后面的代码就不会执行了???(实际测试还在执行)
[/Quote]
benbenxiaoluchi 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guosha 的回复:]
不调exit会继续执行后面的代码,而调用exit进程就退出了。
先把进程的基本东西搞清楚再谈守护进程。
[/Quote]
您的意思, 我main中调用BackGroundSvr 后面的代码就不会执行了???(实际测试还在执行)
benbenxiaoluchi 2008-10-14
  • 打赏
  • 举报
回复
多谢14 15。 FORK拷贝进程上下文环境我知道。 但是子进程返回点把握不好,比如父进程在FORK之前是这种顺序执行和还是循环执行,子进程的返回点就不同,还是得多看看。
love_aiqiu_123 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wlabing 的回复:]
把fork相关知识看看,fork后发生了些什么事件。
你可以这样简单的理解:一头黄牛(称为甲),对它fork后(可以理解为用克隆技术),产生了另一头牛(称为乙)。在某一时刻甲牛死掉了,乙牛也要会一起死掉吗?
[/Quote]形象!!

支持 guosha

意思就是,下面的代码已经拷贝到子进程中去了,所以是 子进程在执行下面的代码。


benbenxiaoluchi 2008-10-13
  • 打赏
  • 举报
回复
呵呵 可能我的问题没有问清楚,在说一下:
我知道exit这里是父进程退出了而不是子进程退出了。 但是fork是BackGroundSvr这个函数里面的。
而BackGroundSvr这个函数是 main()调用的。
现有的代码,main在调用了BackGroundSvr后,下面还做好多事情。
问题是 在BackGroundSvr 父进程exit了 ,那么main下面的工作,还会作吗?
如果main函数中BackGroundSvr下面的代码还起作用, 是为什么 ?难道父进程没退出吗? 如果不起作用,难道main下面的代码就白写了?
qsxiaoyao 2008-10-13
  • 打赏
  • 举报
回复
期待高人的解答
benbenxiaoluchi 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wzzww 的回复:]
你的错误在于把这几行代码看作是顺序执行的了

要知道这时候子进程也已经执行了,应该说是在fork()之后就已经开始执行自进程了。

[/Quote]

呵呵 , 程序分叉执行了我知道。我是纳闷当pid>0 ,即父进程exit(0)后, 那么 main函数还怎么往下执行??
benbenxiaoluchi 2008-10-13
  • 打赏
  • 举报
回复
是的 fork之后 子进程执行了。
但是:
else if ( pidSub > 0 )
{
exit( 0 );
//这里退出的不是父进程吗?? 这里父进程推出后, main函数后面的部分还能执行吗??谢谢。
}
无知者无谓 2008-10-13
  • 打赏
  • 举报
回复
你的错误在于把这几行代码看作是顺序执行的了

要知道这时候子进程也已经执行了,应该说是在fork()之后就已经开始执行自进程了。
benbenxiaoluchi 2008-10-13
  • 打赏
  • 举报
回复
呵呵 在线等高人解答。
once_and_again 2008-10-13
  • 打赏
  • 举报
回复
改子进程的属性,比如进程组长,会话长,
然后 父进程退出
xxgamexx 2008-10-13
  • 打赏
  • 举报
回复
mark
快乐田伯光 2008-10-13
  • 打赏
  • 举报
回复
不调exit会继续执行后面的代码,而调用exit进程就退出了。
先把进程的基本东西搞清楚再谈守护进程。
benbenxiaoluchi 2008-10-13
  • 打赏
  • 举报
回复
那 父进程调用exit和不调用exit 有什么区别?
LIANGZIYINGXIONG 2008-10-13
  • 打赏
  • 举报
回复
fork之后的代码还起作用的,它会拷贝整个父进程的地址空间,所以在父进程退出后还是会执行后面的代码。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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