【问题标题】:How to open files through fork in perl? Perl migration issue (5.6 to 5.8)perl中如何通过fork打开文件? Perl 迁移问题(5.6 到 5.8)
【发布时间】:2016-07-21 09:31:30
【问题描述】:

我们正在为我们的一个应用程序进行 perl 升级(5.6 到 5.8)。

在 5.6 中我们使用下面的示例代码来实现多线程,

$connection->{output} = new IO::File;
my $pid = open ($connection->{output}, "-|");
        if (not defined $pid) {
                die qq("open fork failed: $!);
            } elsif ($pid != 0) {
               $connection->{pid} = $pid;
                next LOOP;
            } else {
               select(STDOUT);
               $| = 1;
               print "Something";
               POSIX::_exit(0);
}

但是在 perl 5.8 中,'-|'不支持。所以我试图通过 fork() 来做同样的事情。但是如何实现'-|'通过 fork 使代码像 5.6 一样工作。

非常感谢任何帮助..

【问题讨论】:

  • 你需要设置一个管道来获得相当于-|的fork。你不能用管道open 代替-| 吗?它为新进程分叉、设置STDOUT,并且是非阻塞的。
  • 对不起,我没听懂你,请你详细说明..
  • 我不知道IO::File 做了什么,但-| 通常意味着管道输出进程。如果您使用fork 创建一个新进程,则必须使用pipe 以便进程可以通信。否则,my $pid = open my $fh, '-|', $cmd 会完全这样做。然后你从$fh 读取,这就是$cmdSTDOUT。这是你需要做的吗?
  • open 的页面有示例。搜索“from_kid”。此外,this post 很容易浮现在脑海中。关于“piped open”还有更多内容。 (如果我明白你需要做什么。)
  • Perl 5.8 仍然很旧。如果您正在进行更新,为什么不直接推进到一个不是生命终结的版本呢?从 2003 版本的 perl 迁移到 2008 版本的 perl 是一个进步,但您仍然落后 8 年。

标签: perl fork


【解决方案1】:
defined( my $pid = open ($connection->{output}, "-|") )
   or die($!);

if ($pid) {
   ...
} else {
   ...
}

类似于

pipe(my ($FROM_CHILD, $TO_PARENT))
   or die($!);

defined( my $pid = fork() )
   or die($!);

if ($pid) {
   close($TO_PARENT);
   ...
} else {
   close($FROM_CHILD);
   open(STDOUT, '<&', $TO_PARENT)
      or die($!);

   ...
}

【讨论】:

  • 我尝试做同样的事情(管道和叉子)。但是控制权正在转移到父母或孩子身上。两个块都没有被执行。每次控制只转到 else 块。
  • 这是一个完全不同的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2013-07-13
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多