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不会受到影响吗?
答案 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
并按照您的意愿重新打开它,并且您根本不会影响父进程。