免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: 蓝色键盘
打印 上一主题 下一主题

fork、exec系列与system、popen区别 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-03-03 14:35 |只看该作者

fork、exec系列与system、popen区别

还有一个区别就是当用fork创建出来的子进程, 当子进程运行完以后(即自动消亡), 在进程表里面还是有这些消亡子进程的项, 而用system创建出来的子进程消亡以后就不会滞留在进程表里面.
yagamiiori 该用户已被删除
32 [报告]
发表于 2006-10-09 23:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
33 [报告]
发表于 2006-10-12 13:48 |只看该作者
看完这个再回头看APUE又有新的收获~!

论坛徽章:
0
34 [报告]
发表于 2006-10-12 16:07 |只看该作者
看了一下,大有收获!
有几个问题:
代码1:
int main()
{
        pid_t pid;
        int i = 0;
        printf("asfsda\n");

                if( (pid=fork()) < 0)
                        fprintf(stdout, "fork error on %d\n",i);
                else if( pid > 0)
                        printf("parent fork  %d\n",i);
                else   
                {      
                    printf("child fork %d\n", i);
                    //exit(0);       //这里不明白
                }      
      
        
        return(0);
}

1.这个程序为什么子进程不执行  printf("asfsda\n");呢?子进程不是复制了父进程的所有代码吗?
2.子进程中加不加exit(0); 有什么对执行代码有什么区别?
代码2:
int main()
{
        pid_t pid;
        int i = 0;
        printf("asfsda\n");
     for(i=0;i<3;i++)
        while(1)        
        {      
                if( (pid=fork()) < 0)
                        fprintf(stdout, "fork error on %d\n",i);
                else if( pid > 0)
                        printf("parent fork  %d\n",i);
                else   
                {      
                    printf("child fork %d\n", i);
                  //exit(0);   //不明白的地方
                }      
        }      
        
        return(0);
}
1.这个代码多了个循环,在子进程中加不加exit(0);我都试了一下,结果是:
(1)加exit(0);结果:
asfsda
parent fork  0
parent fork  1
child fork 0
child fork 1
child fork 2
parent fork  2
不加exit(0);结果:
asfsda
parent fork  0
parent fork  1
parent fork  2
child fork 0
parent fork  1
child fork 1
parent fork  2
child fork 1
parent fork  2
parent fork  2
child fork 2
child fork 2
child fork 2
child fork 2
据我分析是子进程又fork了子进程的原因.具体可参考http://bbs.chinaunix.net/viewthr ... &highlight=fork .也就是说子进程从for()开始循环.
这里我就不明白了,为什么子进程没有执行printf("asfsda\n");而是从for开始执行呢?是fork函数对循环作特殊处理了吗?


那位高人给解答一下,谢谢了!!

论坛徽章:
0
35 [报告]
发表于 2006-10-12 16:19 |只看该作者
原帖由 yagamiiori 于 2006-10-9 23:01 发表
原因很简单,当父进程创建了一个socket的时候,fork一个子进程,子进程继承了个这个文件描述符,当子进程关闭这个socket时,oracle端如果是使用select、poll、epoll这种技术会捕捉的到,然后关闭对端。这时候父进 ...



说一下我的看法:
我看过一个socket程序的服务端,他的功能就是接收链接,然后创建子进程执行一些功能,

signal( SIGCHLD, ctld_deal_child );//信号SIGCHLD处理
signal( SIGPIPE, SIG_IGN );//忽略SIGPIPE
while(1){
clisock = ctld_accept( svrsock, &sockin, &addrlen );
if (0 == (ret = fork())){
  g_session.sock = clisock;
  //子进程功能实现!
  exit(0);

}}else if( ret > 0 ){/* Parent */
        ctld_close( clisock );
        }else{
              CTLD_DEBUG( MAIN_TAG, "Fork error, possible?\n" );//日志
        }
}
程序在创建子进程后在父进程中关闭了clisock ,程序执行不会有问题.
yagamiiori所说的情况是不是父进程没有处理信号SIGPIPE呀?

高手解释一下,谢谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP