如何向Perl中的popen'ed进程发送信号?

时间:2010-10-04 06:13:08

标签: c perl signals

我编写了一个简单的Perl脚本,它将在while循环中运行,并在任何信号发送到此Perl脚本时退出。我编写了一个使用pthread_create()创建线程的c程序,在其启动例程中,它使用popen来执行该Perl脚本:

popen("/usr/bin/perl myprog.pl");

我在Perl脚本中使用sigtrap来捕获它收到的任何信号。现在我想从我的C程序发送信号(TERM)到该线程执行的Perl进程。我怎样才能做到这一点?有没有办法向popen'ed进程发送信号。如果需要更多详细信息,请与我们联系。

2 个答案:

答案 0 :(得分:8)

发送信号通常使用kill。为了能够杀死你,通常需要你想要发出信号的进程的进程id,PID。

popen并没有给你这个。但是,有几种选择:

您可以使用0的PID,它会将您的信号发送到流程组中的每个流程。如果您只有一个父流程使用popen生成一个子流程,则使用kill(0, your_signal)将是一种方法。

另一种方法是让子进程将其PID传回父进程,例如,在启动后的第一件事就是在单行上输出它。

在perl中,这看起来像是

print $$, "\n";

然后popen的进程可以从它获得的文件句柄中读取该行,并使用strtolatoi从中提取有用的pid,并将其保留用于{I}后来,在阅读了其子进程的实际输出之后。{/ p>

如果由于某种原因,这些方法都不适用于您的问题,您可能希望完全停止使用kill,并完成手动执行的大部分工作,最重要的是popen因为那就是为你提供用于以后发送信号的PID。

答案 1 :(得分:2)

popen()没有给你任何方法来访问你需要的子进程的PID,以便发出信号。

你需要自己做popen()的血腥工作(设置管道,分叉,执行,等待)。