2011-11-16 11 views
1

如何在perl腳本中產生其他程序,並立即繼續Perl處理(而不是暫停,直到產生的程序終止)? 是否有可能在運行時處理來自衍生程序的輸出,而不是等待它結束?如何在perl腳本中產生其他程序並立即繼續Perl處理?

+0

[Perl常見問題解答8:如何在後臺啓動進程?](http://learn.perl.org/faq/perlfaq8.html#How -do-I-start-a-process-in-the-the-background-),http://stackoverflow.com/questions/2711520/how-can-i-run-perl-system-commands-in-the-background http://stackoverflow.com/questions/2133910/how-can-i-fire-and-forget-a-process-in-perl – daxim

回答

6

您可以使用open這個(用兩個命令行參數運行程序/bin/some/program):

open my $fh, "-|", "/bin/some/program", "cmdline_argument_1", "cmdline_argument_2"; 
while (my $line = readline($fh)) { 
    print "Program said: $line"; 
} 

$fh閱讀會給你你正在運行的程序的標準輸出。

其他的方式工作的,以及:

open my $fh, "|-", "/bin/some/program"; 
say $fh "Hello!"; 

你的文件句柄到生成過程的標準輸入寫此管道的一切。

如果要讀取和寫入同一進程,請查看IPC::Open3IPC::Cmd模塊。

1

要在後臺運行程序並「繼續」,您只需在命令末尾添加「&」(假設您使用的是Linux)。例如:system("command &");請注意system("command", "arg1", "&");將不起作用,因爲它會將「&」傳遞給命令而不傳遞給shell。你可以簡單地打印命令的輸出:print system("command");

+0

當你投票寫下評論爲什麼它沒有用。我認爲這是一個有效的答案,因爲有兩個問題,一個是處理輸出,另一個是繼續其餘代碼而不等待命令完成。如果我錯了,我會很高興知道原因 – SAN

+0

system()不會返回命令的輸出,而是返回代碼/退出狀態。子進程繼承進程調用system()時的stdin/out/err。另外,我不喜歡鼓勵人們使用單參數系統() - 它帶有可怕的安全風險。 – Martijn

相關問題