【发布时间】:2010-12-07 10:24:11
【问题描述】:
我有一个功能(简而言之):
my $file = IO::File->new("| some_command >> /dev/null 2>&1")
or die "cannot open some_command for writing: $!\n";
...
undef $file;
现在我什至没有给$file 写任何东西。目前$file 上根本没有其他操作。当我运行程序时,它没有正确退出。我看到句柄已关闭,但我的程序仍在等待进程关闭。使用strace捕获:
close(6) = 0
rt_sigaction(SIGHUP, {SIG_IGN}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, {SIG_IGN}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN}, {SIG_DFL}, 8) = 0
wait4(16861, ^C <unfinished ...>
如果我打开相同的进程进行阅读,我看不到这个问题。
我必须做什么才能让程序退出?
编辑:到目前为止的建议是使用 Expect 库或通过 ctrl+d 完成输入流。但此时我不想以任何方式与程序进行交互。我希望它完全现在完成,而不再进行任何 IO。这可能吗?
【问题讨论】:
-
你到底想达到什么目的?
-
好吧 - 我只是想让程序退出 ;) - 到目前为止它只是挂在 wait4() 调用上。
-
您可能想要关闭文件,而不是取消定义它。
$file->close -
undef 根据 perldoc 关闭文件。 strace 输出中还有一个 close(6) 。 (显式
->close()也没有改变任何东西,试过了) -
我了解到您希望程序退出。你的程序的总体目的是什么?答案取决于那个目的以及
some_command的作用。
标签: linux perl process ipc pipe