C 如何向popen';Perl中的ed进程?

C 如何向popen';Perl中的ed进程?,c,perl,signals,C,Perl,Signals,我编写了一个简单的Perl脚本,它将在while循环中运行,并在任何信号发送到此Perl脚本时退出。我编写了一个c程序,它使用pthread_create()创建一个线程,并在其启动例程中使用popen执行该Perl脚本: popen("/usr/bin/perl myprog.pl"); 我使用Perl脚本中的sigtrap捕获它接收到的任何信号。现在我想从我的C程序向线程执行的这个Perl进程发送信号(TERM)。我该怎么做?是否有任何方法可以向popen的进程发送信号。如果需要更多详细信

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

popen("/usr/bin/perl myprog.pl");
我使用Perl脚本中的
sigtrap
捕获它接收到的任何信号。现在我想从我的C程序向线程执行的这个Perl进程发送信号(TERM)。我该怎么做?是否有任何方法可以向
popen
的进程发送信号。如果需要更多详细信息,请告诉我。

popen()
不允许您访问子进程的PID,您需要它来发出信号


您需要自己完成
popen()
的繁重工作(设置管道、分叉、执行、等待)。

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


popen
不会给你这个。但是,有两种选择:

您可以使用
0
的PID,它将向进程组中的每个进程发送信号。如果您只有一个父进程使用
popen
生成一个子进程,那么使用
kill(0,您的_信号)
将是一种方法

另一种方法是让子进程将其PID反馈给父进程,例如,启动后第一件事就是在单行上输出PID

在perl中,这看起来像

print $$, "\n";
执行
popen
的进程随后可以从它得到的文件句柄中读取该行,并使用
strtol
atoi
从该行中提取有用的pid,并在读取子进程的实际输出后,将其保留在
kill
中以供以后使用

无论出于何种原因,如果这些方法都不适用于您的问题,您可能希望停止同时使用
popen
,并手动执行大部分操作,最重要的是
fork
ing,因为这将为您提供PID以用于以后发送信号