2013-08-30 23 views
0

我想製作一個包裝器,它將從STDIN獲取數據並將其傳遞給另一個腳本,等待他的STDOUT響應並將其輸出到父級的STDOUT。IPC :: Open2中間件

我有以下的代碼,但它似乎並不工作:

test.pl 
#!/usr/bin/perl 
# 
use IPC::Open2; 
$pid = open2(\*RDR, \*WTR, '/usr/bin/perl test2.pl'); 

while (<STDIN>) { 
    print WTR; 
} 

while (<RDR>) { 
    print STDOUT; 
} 

,並在test2.pl,我有:

#!/usr/bin/perl 
# 

while (<STDIN>) { 
    print STDOUT; 
} 

它似乎寫test2.pl但我沒有來自test2.pl的反饋。

任何提示?

感謝的,

回答

2
  1. 你應該close WTR當您完成從STDIN閱讀。你的外部命令會持續期待輸入,直到你這樣做,如果你正在遭受緩衝,你的外部程序將不會終止,它不會輸出任何東西。

  2. 您可能是"suffering from buffering" 您的主腳本和 您的外部命令。 在您的測試腳本中,您可以將$|=1添加到腳本的頂部以使其輸出更具響應性。不過,您可能無法影響任意外部命令的輸出緩衝。

更新:IPC::Open2已經設置自動沖洗的寫文件句柄,所以外部命令不會被餓死的輸入。

+0

由於暴徒指出添加一個$ | = 1的子進程將會有所斬獲。請注意,您必須關閉父進程的標準輸入以允許它從第一個循環中退出(在unix上,它足以按下ctrl-d) – cyberz