【问题标题】:Separate STDIN between parent and child process在父进程和子进程之间分离 STDIN
【发布时间】:2015-04-12 05:13:25
【问题描述】:

Redirect two or more STDOUT to a single STDIN

http://en.wikipedia.org/wiki/Standard_streams 表示“更一般地说,子进程将继承其父进程的标准流。”

我假设如果子进程关闭 stdin,那么父进程的 stdin 也会关闭,并且不会获取任何用户输入的代码,例如:

if ($select->can_read(1)) {
    my $char = getc();
    if (defined $char) {
        print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $char\n";
    }
}

父进程是否可以将自己的 STDIN 与子进程的 STDIN 分开,以便子进程可以使用 STDIN 做任何事情,并且父进程的 STDIN 不会受到影响?

【问题讨论】:

  • 如果你想一想——“其他”标准输入从哪里来?你会怎么区分?但是您可以使用管道或不同的文件流。

标签: perl unix io stdin


【解决方案1】:

我假设如果子进程关闭标准输入,那么父进程的标准输入也会关闭

不,孩子得到了句柄的克隆。

$ echo -n 'abcdefghijkl' | perl -e'
   sub r { sysread(STDIN, my $buf, 3); $buf }  # Unbuffered read.
   if (fork()) {
      print "Parent: $_\n" for r();
      sleep(2);
      print "Parent: $_\n" while $_ = r();
   } else {
      sleep(1);
      print "Child: $_\n" for r();
      close(STDIN);
      print "Child: Closed STDIN\n";
   }
'
Parent: abc
Child: def
Child: Closed STDIN
Parent: ghi
Parent: jkl

父进程是否可以将自己的 STDIN 与子进程的 STDIN 分开,以便子进程可以使用 STDIN 为所欲为,而父进程的 STDIN 不会受到影响?

是的。例如,foo <file 设置 foo 的 STDIN,而不是让它继承其父级的。

【讨论】:

    【解决方案2】:

    子进程获得父进程标准句柄的重复项——它们是副本,而不是同一个句柄。这意味着子进程可以关闭其STDIN 并根据需要重新打开它,而您根本不会影响父进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2019-02-27
      • 2013-12-24
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多