在父进程和子进程之间分离STDIN

时间:2015-02-11 17:51:20

标签: perl unix io stdin

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不会受到影响吗?

2 个答案:

答案 0 :(得分:3)

  

我假设一个子进程关闭stdin然后父进程stdin也被关闭

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

$ 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,而不是让它继承其父级。

答案 1 :(得分:3)

子进程获取父级标准句柄的重复 - 它们是副本,而不是相同的句柄。这意味着孩子可以关闭其STDIN并按照您的意愿重新打开它,并且您根本不会影响父进程。