我有一個模擬tee命令的perl腳本,所以我可以將輸出寫入終端和日誌文件。它的工作原理是這樣的(錯誤檢查& c略)。perl父進程掛起等待子進程讀取stdin
$pid = open(STDOUT, '-|');
# Above is perl magic that forks a process and sets up a pipe with the
# child's STDIN being one end of the pipe and the parent's STDOUT (in
# this case) being the other.
if ($pid == 0)
{
# Child.
# Open log file
while (<STDIN>)
{
# print to STDOUT and log file
}
#close log files
exit;
}
# parent
open STDERR, '>&STDOUT';
# do lots of system("...") calls
close STDERR;
close STDOUT;
exit;
這有時會掛起,並不約而同如果你看一下進程和堆疊說的過程中,父母是懸在關閉的一個,等待孩子退出,而孩子掛讀點從一個文件(它必須是STDIN,因爲沒有其他文件)。
我對如何處理這件事感到茫然。如果你從一個沒有連接到控制檯的shell運行程序,這個問題似乎就會發生 - 在一個正常的shell中運行腳本工作正常 - 並且該腳本中最近更改的唯一代碼是添加打開/關閉文件只是爲了觸摸它(並且在腳本到達這個'tee'代碼之前)。
有沒有人有過這樣的問題,和/或有什麼我可以做的解決這個問題的建議?謝謝。
這是_always_分離時發生嗎? STDOUT是否早於重定向 - 在cron-ed命令行或程序中? – zdim
我看不出問題,對我而言,它無論如何都有效。我更新了自己想要的具體內容,並使用了我正在使用的確切代碼。我正在考慮緩衝/ STDIN越來越混亂。例如,最後的打印(最後一個緩衝區)不會被刷新。 – zdim