我写了一个简单的 Perl 脚本,它将在 while 循环中运行,并在任何信号发送到此 Perl 脚本时退出。我写了一个 c 程序,它使用 pthread_create()
创建一个线程,在它的启动例程中,它使用 popen
来执行那个 Perl 脚本:
popen("/usr/bin/perl myprog.pl");
我在 Perl 脚本中使用 sigtrap
来捕获它接收到的任何信号。现在我想从我的 C 程序发送信号 (TERM) 到线程执行的这个 Perl 进程。我怎样才能做到这一点?有什么方法可以向 popen
的进程发送信号。如果需要更多详细信息,请告诉我。
最佳答案
发送信号通常使用kill
。为了能够杀死您通常需要您要发送信号的进程的进程 ID、PID。
popen
不会给你那个。但是,有几种选择:
您可以使用 0
的 PID,这会将您的信号发送到进程组中的每个进程。如果您只有一个父进程使用 popen
生成一个子进程,那么使用 kill(0, your_signal)
将是一种方法。
另一种方法是让子进程将其 PID 传回给父进程,例如,在启动后的第一件事就是在一行中输出它。
在 perl 中,这看起来像
print $$, "\n";
执行 popen
的进程然后可以从它获得的文件句柄中读取该行,并使用 strtol
或 atoi
从中提取有用的 pid >,并保留它以便稍后在读取其子进程的实际输出后与 kill
一起使用。
如果出于某种原因,这些方法都不能解决您的问题,您可能希望完全停止使用 popen
,并手动执行大部分操作,最重要的是 fork
,因为这将为您提供 PID 以用于稍后发送信号。
关于c - 我如何向 Perl 中的 popen'ed 进程发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3853220/