免费注册 查看新帖 |

Chinaunix

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

请教Perl 关于fork! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-20 23:12 |只看该作者 |倒序浏览
求助,我是Perl新手,忘各位不吝赐教!

请看下面这个简单的函数
sub system_nb
{
    my (@cmd) = @_;        
#假设@_  是"testcase/uboot_reset_test.exp  /home/glasswm/atestout/111/logs/20091020-02/atest.autoconfig"

    if(my $pid = fork) {  #请问此处的fork会带什么默认的隐藏参数吗?
        #1
        waitpid($pid, 0);
        return $?;
    } else {
        #2
        die "cannot fork: $!\n" unless defined $pid;
        exec(@cmd) or die "exec: @cmd: $!";    #请问此处的exec 是用fork成功的线程OR进程执行@cmd命令(这里是执行另外一个脚本)吗   
    }
}

我在#1 和 #2处加了标记提示,我就纳闷了 怎么既走到了#2处然后又走回了#1处,perl的IF ELSE难道跟C的不一样? (关键就是这里不明白)

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2009-10-20 23:15 |只看该作者
一样。

论坛徽章:
0
3 [报告]
发表于 2009-10-21 08:20 |只看该作者

回复 #1 glasswm 的帖子

因为 fork 调用时,当前的进程会从 fork 的位置一分为二,fork 对两个进程的返回值不同。在父进程中 fork 返回子进程(即另一个进程)的进程id,而在子进程中 fork 返回 0。

see here:http://tech.idv2.com/2006/10/14/linux-multiprocess-info/

论坛徽章:
0
4 [报告]
发表于 2009-10-21 09:32 |只看该作者
#请问此处的exec 是用fork成功的线程OR进程执行@cmd命令(这里是执行另外一个脚本)吗   


exec是执行@cmd里的命令替换当前进程,除了进程号不变外,其他东西都变了。


我在#1 和 #2处加了标记提示,我就纳闷了 怎么既走到了#2处然后又走回了#1处,perl的IF ELSE难道跟C的不一样? (关键就是这里不明白)


在fork后,#1和#2是并发进行的,各自完成各自的事。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-10-21 10:04 |只看该作者
别口口声声 Perl 如何 C 如何,
你真的在 C 里面用过 fork?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2009-10-21 10:05 |只看该作者

回复 #4 兰花仙子 的帖子

够详细!学习!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2009-10-21 10:06 |只看该作者

回复 #5 flw_cu 的帖子

LZ应该是指C的if与perl的if是否相同吧。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2009-10-21 10:20 |只看该作者
原帖由 blackold 于 2009-10-21 10:06 发表
LZ应该是指C的if与perl的if是否相同吧。

他之所以有此一问,是因为他不了解 fork。
如果他在 C 里面用过 fork 的话,
就会知道,这里 if/else 的表现和 C 明显是一样的。

论坛徽章:
0
9 [报告]
发表于 2009-10-21 10:37 |只看该作者

回复 #8 flw_cu 的帖子

你的名字看上去好熟悉啊!

论坛徽章:
0
10 [报告]
发表于 2009-10-21 16:57 |只看该作者
要搞清楚fork的意思,可以man一下,google一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP