【问题标题】:Perl pipe and C process as child [Windows ]Perl 管道和 C 进程作为子进程 [Windows]
【发布时间】:2010-10-30 13:19:40
【问题描述】:

我想派生一个孩子(这是我的 C 可执行文件)并在 perl 和 C 进程之间共享一个管道, 是否可以将 STDOUT 和 STDIN 用作管道。

尝试使用以下代码,但子进程继续运行。

use IPC::Open2;
use Symbol;
my $CHILDPROCESS= "chile.exe";
$WRITER = gensym();
$READER = gensym();

my $pid = open2($READER,$WRITER,$CHILDPROCESS);
while(<STDIN>)
{
   print $WRITER $_;
}
close($WRITER);
while(<$READER>)
{
    print STDOUT "$_";
}

【问题讨论】:

    标签: perl


    【解决方案1】:

    perlipc 文档的Safe Pipe Opens 部分描述了一个很好的功能:

    open 函数将接受 "-|""|-" 的文件参数来做一件非常有趣的事情:它派生一个连接到您打开的文件句柄的子节点。孩子正在运行与父母相同的程序。例如,这对于在假定的 UID 或 GID 下运行时安全打开文件很有用。如果您打开一个减号管道,您可以写入您打开的文件句柄,您的孩子会在他的STDIN 中找到它。如果您从减号打开管道,您可以从您打开的文件句柄中读取您的孩子写给他的STDOUT 的任何内容。

    但是根据perlport documentation

    打开

    不支持向|--| 开放。 (Win32、RISC 操作系统)

    【讨论】:

      【解决方案2】:

      编辑:这可能只适用于 Linux。我还没有在 Windows 上尝试过。不过可能有一种方法可以在 Windows 中模拟它。

      这是你想要的我的想法:

      #Set up pipes to talk to the shell.
      pipe(FROM_PERL, TO_C) or die "pipe: $!\n";
      pipe(FROM_C, TO_PERL) or die "pipe: $!\n";
      
      #auto flush so we don't have (some) problems with deadlocks.
      TO_C->autoflush(1);
      TO_PERL->autoflush(1);
      
      if($pid = fork()){
          #parent
          close(FROM_PERL) or die "close: $!\n";
          close(TO_PERL) or die "close: $!\n";
      }
      else{
          #child
          die "Error on fork.\n" unless defined($pid);
      
          #redirect I/O
          open STDIN, "<&FROM_PERL";
          open STDOUT, ">&TO_PERL";
          open STDERR, ">&TO_PERL";
          close(TO_C) or die "close: $!\n";
          close(FROM_C) or die "close $!\n";
      
          exec("./cprogram"); #start program
      }
      

      现在您可以分别通过 FROM_C 和 TO_C 作为输入和输出与 shell 通信。

      【讨论】:

        【解决方案3】:

        Perlmonks 上的问答表明 open2 在 Windows 上运行良好,前提是您管理得足够仔细。

        【讨论】:

          猜你喜欢
          • 2013-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-05
          • 2012-03-04
          • 2012-01-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多