免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3776 | 回复: 9
打印 上一主题 下一主题

循环fork的问题 [复制链接]

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-27 14:32 |只看该作者 |倒序浏览
for(my $i=0;$i<5;$i++)
{
        print "Current process is $$\n";
        my $pid = fork();
        if(!(defined $pid))
        {
                die "Can not fork a child process!!!\n";
        }
        elsif($pid == 0)
        {
                print "This is child process$\n";
#                exit;
        }
        else
        {
                print "This is parent process$\n";
        }
}

打印如下:

Current process is 26563
This is child process:26564
Current process is 26564
This is child process:26565
Current process is 26565
This is child process:26566
Current process is 26566
This is child process:26567
Current process is 26567
This is child process:26568
This is parent process:26566
Current process is 26566
This is parent process:26563
Current process is 26563
This is parent process:26564
Current process is 26564
This is parent process:26565
Current process is 26565
This is child process:26569
This is child process:26570
Current process is 26570
This is child process:26571
Current process is 26571
This is child process:26572
Current process is 26572
This is child process:26573
Current process is 26573
This is child process:26574
Current process is 26574
This is child process:26575
This is parent process:26567
This is child process:26576
Current process is 26576
This is child process:26577
This is child process:26578
This is parent process:26576
This is parent process:26572
This is parent process:26566
This is parent process:26563
Current process is 26563
This is parent process:26564
Current process is 26564
This is parent process:26570
Current process is 26570
This is parent process:26574
This is child process:26579
Current process is 26579
This is child process:26580
Current process is 26580
This is child process:26581
Current process is 26581
This is child process:26582
Current process is 26582
This is child process:26583
This is child process:26584
This is parent process:26579
Current process is 26579
This is parent process:26563
Current process is 26563
This is parent process:26570
Current process is 26570
This is parent process:26582
This is child process:26586
This is child process:26587
Current process is 26587
This is child process:26588
This is child process:26589
This is parent process:26579
This is parent process:26570
This is parent process:26565
Current process is 26565
This is child process:26590
This is parent process:26565
This is parent process:26571
Current process is 26571
This is child process:26591
This is parent process:26571
This is parent process:26573
Current process is 26573
This is child process:26592
This is child process:26585
This is parent process:26573
This is parent process:26564
Current process is 26564
This is child process:26593
This is parent process:26564
This is parent process:26580
This is parent process:26581
This is parent process:26563
Current process is 26563
This is child process:26594
This is parent process:26563

这段代码会循环的fork进程,子进程也循环fork。如果把exit加上的话就没是我想要的了。

在执行完print "This is child process$\n";后子进程不是已经退出了吗?怎么还fork呢?

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
2 [报告]
发表于 2009-11-27 14:47 |只看该作者
Current process is 28397
This is child process:28398
This is parent process:28397
Current process is 28397
This is child process:28399
This is parent process:28397
加了exit后是这样。

论坛徽章:
0
3 [报告]
发表于 2009-11-27 15:25 |只看该作者
[root@xinxiang ~]# cat test.pl
#!/usr/bin/perl


for(my $i=0;$i<5;$i++)
{
        print "Current process is $$  .....  $i\n";
        my $pid = fork();
        if(!(defined $pid))
        {
                die "Can not fork a child process!!!\n";
        }
        elsif($pid == 0)
        {
                print "This is child process$$\n";
                exit;
        }
        else
        {
                print "This is parent process$$\n";
        }
}
[root@xinxiang ~]# perl test.pl
Current process is 20793  .....  0
This is child process20794
This is parent process20793
Current process is 20793  .....  1
This is child process20795
This is parent process20793
Current process is 20793  .....  2
This is child process20796
This is parent process20793
Current process is 20793  .....  3
This is child process20797
This is parent process20793
Current process is 20793  .....  4
This is child process20798
This is parent process20793

论坛徽章:
0
4 [报告]
发表于 2009-11-27 15:26 |只看该作者
[root@xinxiang ~]# cat test.pl
#!/usr/bin/perl


for(my $i=0;$i<5;$i++)
{
        print "Current process is $$  .....  $i\n";
        my $pid = fork();
        if(!(defined $pid))
        {
                die "Can not fork a child process!!!\n";
        }
        elsif($pid == 0)
        {
                print "This is child process$$\n";
                #exit;
        }
        else
        {
                print "This is parent process$$\n";
        }
}
[root@xinxiang ~]# perl test.pl
Current process is 20846  .....  0
This is child process20847
Current process is 20847  .....  1
This is child process20848
Current process is 20848  .....  2
This is parent process20846
Current process is 20846  .....  1
This is child process20849
Current process is 20849  .....  3
This is child process20850
Current process is 20850  .....  2
This is child process20851
Current process is 20851  .....  4
This is child process20852
Current process is 20852  .....  3
This is parent process20847
This is child process20853
Current process is 20847  .....  2
This is child process20854
Current process is 20854  .....  4
This is child process20855
Current process is 20855  .....  3
This is parent process20851
This is parent process20848
Current process is 20848  .....  3
This is child process20856
This is child process20857
Current process is 20857  .....  4
This is child process20858
This is parent process20849
Current process is 20849  .....  4
Current process is 20858  .....  4
This is parent process20854
This is child process20859
This is parent process20852
Current process is 20852  .....  4
This is parent process20849
This is child process20861
This is parent process20858
This is parent process20857
This is child process20862
This is parent process20848
Current process is 20848  .....  4
This is parent process20847
Current process is 20847  .....  3
This is parent process20846
This is child process20860
Current process is 20846  .....  2
This is parent process20848
This is child process20864
Current process is 20864  .....  4
This is child process20865
Current process is 20865  .....  3
This is child process20866
This is child process20867
This is parent process20855
Current process is 20855  .....  4
Current process is 20867  .....  4
This is parent process20864
This is parent process20852
This is child process20868
This is child process20869
This is parent process20847
Current process is 20847  .....  4
This is parent process20867
This is parent process20855
This is parent process20847
This is parent process20865
Current process is 20865  .....  4
This is child process20871
This is parent process20865
This is child process20863
This is child process20870
This is parent process20846
Current process is 20846  .....  3
This is child process20872
Current process is 20872  .....  4
This is child process20873
This is parent process20846
Current process is 20846  .....  4
This is parent process20872
This is parent process20846
This is child process20874
This is parent process20850
Current process is 20850  .....  3
This is child process20875
Current process is 20875  .....  4
This is child process20876
This is parent process20875
[root@xinxiang ~]# This is parent process20850
Current process is 20850  .....  4
This is child process20877
This is parent process20850

论坛徽章:
0
5 [报告]
发表于 2009-11-27 15:27 |只看该作者
我的理解是如果子进程不退出,子进程和父进程都会调用for语句。

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
6 [报告]
发表于 2009-11-27 15:31 |只看该作者

回复 #5 dahe_1984 的帖子

子进程那部分不是已经结束了吗?还没退出?必须用exit吗?

论坛徽章:
0
7 [报告]
发表于 2009-11-27 15:59 |只看该作者
ding~

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
8 [报告]
发表于 2009-11-27 16:24 |只看该作者
再顶下

论坛徽章:
0
9 [报告]
发表于 2009-11-27 17:34 |只看该作者
开始fork之前的环境被复制了.子进程也会进入循环的.
这部分再仔细看看书吧.:wink:

论坛徽章:
0
10 [报告]
发表于 2009-11-27 17:36 |只看该作者
必须exit的。如果想多进程,建议http://search.cpan.org/~dlux/Par ... .7.5/ForkManager.pm
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP