STDIN

2015-02-11 37 views
0

Redirect two or more STDOUT to a single STDINSTDIN

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

如果一个子进程关闭标准输入,然后父母的标准输入被关闭,以及我假设,而不是刚开任何用户输入的代码,如:

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

父进程可以有自己的STDIN从子进程分离'STDIN,这样子进程可以用STDIN做任何事情,父进程的STDIN不会受到影响?

+0

如果你想一想 - '其他'STDIN会从哪里来?你会如何区分?但是你可以使用管道或不同的文件流。 – Sobrique 2015-02-11 19:02:11

回答

3

如果一个子进程关闭标准输入,然后父母的标准输入被关闭以及

没有,孩子变手柄的克隆我假设。

$ 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没有得到什么影响呢?

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

3

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