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

标签 c perl signals

我写了一个简单的 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 的进程然后可以从它获得的文件句柄中读取该行,并使用 strtolatoi 从中提取有用的 pid >,并保留它以便稍后在读取其子进程的实际输出后与 kill 一起使用。

如果出于某种原因,这些方法都不能解决您的问题,您可能希望完全停止使用 popen,并手动执行大部分操作,最重要的是 fork ,因为这将为您提供 PID 以用于稍后发送信号。

关于c - 我如何向 Perl 中的 popen'ed 进程发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3853220/

相关文章:

c - 如何复制给定字符串中所有不重复的单词?

matlab - Matlab 中信号的扭曲片段

c - 用户程序被 ^c 中断

c - 当其中一个线程收到信号并且没有一个线程阻止它时,是否所有线程都停止了?

c - 无需轮询的 Linux 同步

c - 在C中用char指针打印字符串

command-line - 无法从 The C Programming Language 编译示例程序

perl - 无法通过包 "new"定位对象方法 "IO::Socket::SSL"

regex - 索引函数中的正则表达式

测试 "0"、 "-0"、 "0.0"、 "00"时的 PHP 和 Perl 行为