专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>perl>

perl之"父进程写往子进程的管道"

百度收藏 QQ搜藏

(一)父进程写往子进程的管道

open(FOO, "|tr '[a-z]' '[A-Z]'");
open(FOO, '|-', "tr '[a-z]' '[A-Z]'");
open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';
这些结果都是一样的。为什么?

先看看第一个:open(FOO, "|tr '[a-z]' '[A-Z]'");

tr是unix的shell命令,代表在管道右边,意味着从管道左边接受输入。

如果你还不清楚,那么在shell里运行:

echo 'abcd' |tr '[a-z]' '[A-Z]'
ABCD

你输入的abcd通过管道传给tr后,就处理成ABCD了。那么,perl里也一样呀。open(FOO, "|tr '[a-z]' '[A-Z]'");它打开一个管道,并将数据通过句柄FOO传递给tr命令。这里有点巧妙,实际上发生了1个fork过程。tr命令实际上是在子进程里完成的啦。

对了,这个子进程与fork出来的有何不同?主要的不同就在于子进程的STDIN被重定向到管道了,也就是说它从FOO句柄接受输入,然后它将结果输出到STDOUT,这样你在屏幕上就可见到ABCD啦。

很简单吧,那接着看第2个:open(FOO, '|-', "tr '[a-z]' '[A-Z]'");

这个与第1个其实一样的,只是写法不同啦!不过很多人被这个|-迷惑住了,我们简单地把这个'-'想象成后面的shell命令就可以了呀。

再看看第3个:open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';

已经说了哦,open过程中实际会发生一个fork过程,这个fork对父进程返回子进程的pid,通常是个正整数;对子进程返回0。所以:

my $pid=open(FOO,'|-');

如果$pid >; 0那就表示位于父进程里啦。||是什么意思呀?||是个or运算符,它后面的条件与前面的条件相反,前面的是$pid >;0,那后面的就是$pid==0啦,这样你就明白了吧,偶已经位于子进程里了。

那exec与system意思差不多,不同的是exec执行的命令完全替代了fork出来的子进程,除了进程号一样外,其他的代码段,堆栈段什么的都替换掉了。如果你不明白,那么翻翻仙子以前的关于exec的解释啦;什么?还不明白?那就把它想象成system()好啦。

所以这里的  open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';

exec从管道接受数据,也就是说在子进程里,从FOO句柄接受数据,转换后再将结果写往标准输出,跟前面2个例子一样呀。

提醒大家上述3种情况下,你应该记住:
1)在父进程里,对FOO句柄操作的行为与正常的一致,例如,你这样将数据写入FOO句柄:
print FOO $str;
2)在子进程里,STDIN被重定向了哦。它默认从管道接受数据了。但STDOUT不变。不要混淆了哦。

上一篇:perl的grep函数用法示例(二) 下一篇:perl之"子进程写往父进程的管道"

power by soyo123 2007-2008