我编写了一个简单的Perl脚本,它将在while循环中运行,并在任何信号发送到此Perl脚本时退出 . 我编写了一个使用 pthread_create()
创建线程的c程序,在其启动例程中,它使用 popen
来执行该Perl脚本:
popen("/usr/bin/perl myprog.pl");
我在Perl脚本中使用 sigtrap
来捕获它收到的任何信号 . 现在我想从我的C程序发送信号(TERM)到该线程执行的Perl进程 . 我怎样才能做到这一点?有没有办法向 popen
'ed进程发送信号 . 如果需要更多详细信息,请与我们联系 .
2 回答
发送信号通常使用
kill
. 为了能够杀死你,通常需要你想要发出信号的进程id,PID .popen
不是't give you that. However, there'的几个选择:您可以使用
0
的PID,它会将您的信号发送到进程组中的每个进程 . 如果您只有一个父进程使用popen
生成一个子进程,那么使用kill(0, your_signal)
将是一种方法 .另一种方法是让子进程将其PID传回父进程,例如,在启动后首先将其输出到单行上 .
在perl中,这看起来像
然后,
popen
的进程可以从它获得的文件句柄中读取该行,并使用strtol
或atoi
从中提取一个有用的pid,并在读取其子进程的实际输出后保留它以便稍后使用kill
.如果,无论出于何种原因,这些方法都不适用于您的问题,您可能希望完全停止使用
popen
,并完成大部分手动操作,最重要的是fork
ing,因为's what'll会为您提供PID使用以后发送信号 .popen()
没有为您提供访问子进程的PID的任何方法,您需要它才能发出信号 .你需要自己做
popen()
的血腥工作(设置管道,分叉,执行,等待) .