QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 819|回复: 6

哪位高手进来看看fork()的问题

[复制链接]
发表于 2003-11-20 08:46:27 | 显示全部楼层 |阅读模式
我对进程的概念不是很清楚,有点问题想请教,附在程序代码后的注释里
main(void)
{
pid_t child;

if((child=fork())==-1)   //当此处用fork创建子进程后,程序的执行流程是什么,子进  
                                      程里执行的是什么程序代码?
{
printf("Fork Error:%s\n",strerror(errno));
exit(1);
}
else if(child>0)              //如果创建子进程成功后,程序到此处,用while(1),
while(1);                       //岂不是死在这儿了?那子进程在执行什么代码呢?
if(kill(getppid(),SIGTERM)==-1)
{
printf("Kill Parent Error:%s\n",strerror(errno));
exit(1);
}
{
int mailfd;

while(1)
{
if((mailfd=open(MAIL,O_RDONLY))!=-1)
{
fprintf(stderr,"%s","\007");
close(mailfd);
}
sleep(SLEEP_TIME);
}
}
}

当我读上面那段程序段时,我也猜到while(1)应该是父进程执行的代码,让父进程阻塞在那儿,然后“while(1)"下面的那些程序段应该是子进程执行的代码段。如果说fork()返回两次值,那么程序流程能解释通。可是我有点疑问,这两次fork()返回都分别在什么时机呢?第一次返回后程序执行到“while(1)”处后,阻塞在那儿,这时fork()又返回值吗?那样的话,不是说程序执行到"while(1)"处后,又往上执行,去判断pid的值啦?这种程序流程好像在c语言里不大常见啊。

哪位高手帮忙点破一下fork()应用的这种机制,谢谢!
发表于 2003-11-21 12:48:56 | 显示全部楼层
while(1)是父进程执行的,子进程不执行,因为在子进程里childe=0
子进程执行kill把他的父进程杀掉

不过父进程也会执行kill把父进程的父进程(应该是bash)杀掉,所以我觉得这应该做一个判断
if(child==0)
{
if(kill(getppid(),SIGTERM)==-1)
{
printf("Kill Parent Error:%s\n",strerror(errno));
exit(1);
}
这样父进程就不会执行kill了
}
回复

使用道具 举报

发表于 2003-11-25 21:12:24 | 显示全部楼层
while(1);
请问着是不是父进程在等待通信而进行同步????
回复

使用道具 举报

发表于 2003-11-26 12:10:17 | 显示全部楼层
[quote:8c31584ec9="Aroutine"]while(1);
请问着是不是父进程在等待通信而进行同步????[/quote]
不是
回复

使用道具 举报

发表于 2003-11-28 14:40:02 | 显示全部楼层
那他是干什么用的呢?
回复

使用道具 举报

发表于 2003-11-28 15:12:44 | 显示全部楼层
防止父进程先于子进程退出
回复

使用道具 举报

发表于 2003-11-29 13:39:20 | 显示全部楼层
收到!
谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-9 10:29 , Processed in 0.058494 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表