(二)子进程写往父进程的管道
看看如下代码: open(FOO, "cat -n '$file'|"); open(FOO, '-|', "cat -n '$file'"); open(FOO, '-|') || exec 'cat', '-n', $file; 先说结论:它们肯定是一样的。
我们先看看第1句。
open(FOO, "cat -n '$file'|");
它的意思其实与前面的差不多哦,cat执行了外部shell命令,等于是fork了一个子进程,它将输出通过管道发送给父进程。如果你还不是很理解,那么看下这个shell命令:
cat -n $file | more
cat的结果通过管道发送给more了。那么cat -n '$file'的结果写往了FOO句柄,父进程正常的读取这个句柄,就可以获取到cat的输出啦。父进程里这样写就可以啦:
print my $line=<FOO>;;
接着看第2句: open(FOO, '-|', "cat -n '$file'");
又是'-|',它与第1句一样,写法不同罢了。记着:把'-'想象成后面的shell命令。
再看第3句哦: open(FOO, '-|') || exec 'cat', '-n', $file;
如果你理解了fork,理解了||,理解了exec,那么看它就清清楚楚啦。作用还是一样的哦,||后面的子进程将结果写往FOO句柄,父进程就从FOO句柄接受数据了。
再次提醒大家,在上述3种情况下要注意: 1)父进程对FOO句柄的操作还是与正常的一致,例如,它这样接受FOO句柄的数据: my $line=<FOO>;; 2)子进程的STDOUT被重定向了,也就是说,子进程的任何输出都会写往管道了。
好了,到这里你应该大概清楚open pipe的方式了吧?还不太明白?那么去看看perldoc的相关手册吧。 |