怎样把文件句柄传递到open打开的通道里

怎样把文件句柄传递到open打开的通道里

open(INPUT, "< /etc/motd")   or die "/etc/motd: $!";
if ($pid = fork) { wait }
else {
        defined($pid)      or die "fork: $!";
        $fdfile = "/dev/fd/" . fileno(INPUT);
        exec("cat", "-n", $fdfile) or die "exec cat: $!";
}



+++++++++++++++++++++++++++++++

local $^F = 10_000;
open(INPUT, "< /etc/motd") or die "/etc/motd: $!";

if ($pid = fork) { wait }
else {
        defined($pid)      or die "fork: $!";
        exec("cat", "-n", INPUT) or die "exec cat: $!";
}


这两段代码那儿有错误。 为什么不能把INPUT这个文件句柄带入到open管道里


QUOTE:
原帖由 miaho 于 2009-1-11 17:09 发表
exec("cat", "-n", $fdfile) or die "exec cat: $!";

cat能这么用吗
在 exec 前把 file descriptor 打印一下看看。


[Copy to clipboard] [ - ]
CODE:
open(INPUT, "< /etc/motd") or die "/etc/motd: $!";

if ($pid = fork) { wait }
else {
    print while (<INPUT>);
}

这两个例子,是我从 perl 语言编程上抄下来的。


QUOTE:
原帖由 ynchnluiti 于 2009-1-11 17:25 发表

open(INPUT, "< /etc/motd") or die "/etc/motd: $!";

if ($pid = fork) { wait }
else {
    print while ();
}

这个我知道, fork的子进程,可以直接继承父的所有句柄,但 open exec system 是无法继承的。我主要想试一下这把句柄带入到exec 中。


QUOTE:
原帖由 miaho 于 2009-1-11 18:52 发表




这个我知道, fork的子进程,可以直接继承父的所有句柄,但 open exec system 是无法继承的。我主要想试一下这把句柄带入到exec 中。

Perl 的 exec 函数是通过 exec*() 系统调用实现的,而这个系统调用只接受字符串型的参数。
那有什么别的好的例子,把句柄带入到exec或者open的例子吗?


QUOTE:
原帖由 miaho 于 2009-1-11 18:52 发表
这个我知道, fork的子进程,可以直接继承父的所有句柄,但 open exec system 是无法继承的。我主要想试一下这把句柄带入到exec 中。

传句柄进去干嘛?减少打开文件次数,提高程序效率吗?