首页 文章

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

提问于
浏览
2

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

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

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

2 回答

  • 2

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

    popen 不是't give you that. However, there'的几个选择:

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

    另一种方法是让子进程将其PID传回父进程,例如,在启动后首先将其输出到单行上 .

    在perl中,这看起来像

    print $$, "\n";
    

    然后, popen 的进程可以从它获得的文件句柄中读取该行,并使用 strtolatoi 从中提取一个有用的pid,并在读取其子进程的实际输出后保留它以便稍后使用 kill .

    如果,无论出于何种原因,这些方法都不适用于您的问题,您可能希望完全停止使用 popen ,并完成大部分手动操作,最重要的是 fork ing,因为's what'll会为您提供PID使用以后发送信号 .

  • 8

    popen() 没有为您提供访问子进程的PID的任何方法,您需要它才能发出信号 .

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

相关问题