簡體   English   中英

Perl Script,Fork / Exec,System聲稱我的進程已死亡,而實際上只有我的子進程已死亡

[英]Perl Script, Fork/Exec, System claims my process has died when in fact only my child process has died

我有一個Perl腳本,該腳本執行fork / exec在后台啟動另一個工具,並在其他工具運行時監視文件系統的某些更改。 這似乎按預期工作。

當我從外殼程序(例如Bash)啟動此Perl腳本時,只要我的Perl腳本正在運行,外殼程序提示就應該消失了。 並且它將一直運行,直到進行了預期的文件修改為止。 但不能保證可以通過外部工具來完成文件修改,在這種情況下,外部工具將退出,但是我的腳本將繼續運行,並且必須以某種方式處理該情況-這種處理超出了問題的范圍,並且與我的問題無關(到目前為止尚未實現)。

我的問題是,一旦我的子進程死亡,Bash就會返回其提示符,聲稱我的進程已完成運行……這是不對的。 它顯然仍在后台運行,並且仍在等待文件系統修改。 如果我繼續在腳本的主循環中打印一些文本,即使bash已經返回到提示符,該文本仍會打印。

我無法弄清楚是什么讓bash相信我的程序已經退出。 我嘗試在腳本中阻止SIGCHLD信號,嘗試關閉和/或重定向STDOUT / STDERR / STDIN(在fork上重復,但您永遠不知道)-沒有成功。 我什至嘗試了著名的“雙叉”,以使最終的孩子獨立於我的腳本過程,結果相同。 無論我做什么,只要我的孩子(或孫子)去世,Bash都會認為我的工作已經退出。 在后台啟動我的腳本(最后使用“&”)使Bash甚至告訴我XYZ進程已經完成(即使我的進程很活躍並且正在通過終端打印到終端,它在這里也命名了我的進程,而不是子進程)。那一刻是STDOUT)。

如果這只是Bash的問題,那么我就不會在乎,但是應該運行我的腳本的其他第三方軟件也以相同的方式運行。 我的孩子去世后,他們聲稱我的劇本實際上已經死亡,這根本不是事實。

只是進行完整性檢查,您的主程序是否正確? 它應遵循非零路徑:

my $pid = fork;
if ($pid == 0) {
    print "Child\n";
} else {
    print "Main\n";
}

人叉

成功完成后,fork()向子進程返回值0,並將子進程的進程ID返回給父進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM