我有一个模拟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