情况:
我正在用C编写一个维护许多线程的程序。一旦线程结束,就会创建一个新线程。
每个线程分叉 - 子进程通过exec()运行进程,父进程等待它完成。
此外,还有一个等待信号的信号处理程序线程。如果检测到SIGINT,则它告诉主线程停止创建线程,以便最终所有线程结束并且程序可以退出。
信号在所有线程中被阻止,当然除了信号处理程序线程。
目的:
我希望能够通过发送SIGTERM来终止程序。这可以通过停止创建新线程的主线程并终止线程创建的运行进程来实现。
问题:
如果所有线程中的信号被阻止,我如何向正在运行的进程发送信号以终止它们?
是否有某种方法可以使衍生过程只接收主程序发送的信号,而不是发送到主程序的信号?
答案 0 :(得分:5)
在新进程组中创建所有子进程,然后将信号发送给该组。
这是一些最小的代码,显示了进程如何通过信号改变它的组和控制子进程。
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
pid_t pgid; /* process group to kill */
void terminator( int s ) /* signal handler */
{
printf( "[%d:%d] received signal %d, exiting\n",
getpid(), getpgrp(), s );
exit( 1 );
}
int main() /* program entry */
{
printf( "[%d:%d] before first fork\n",
getpid(), getpgrp() );
switch ( fork()) /* try with and without first fork */
{
case -1: err( 1, "fork" );
case 0: break;
default: exit( 0 );
}
if ( signal( SIGTERM, terminator ) == SIG_ERR )
err( 1, "signal" );
if ( setpgrp() < 0 ) err( 1, "setpgrp" );
if (( pgid = getpgrp()) < 0 ) err( 1, "getpgrp" );
printf( "[%d:%d -> %d] before second fork\n",
getpid(), getpgrp(), pgid );
switch ( fork())
{
case -1: err( 1, "fork" );
case 0: /* child */
{
printf( "child [%d:%d]\n", getpid(), getpgrp());
sleep( 20 );
break;
}
default: /* parent */
{
printf( "parent [%d:%d]\n", getpid(), getpgrp());
sleep( 5 );
killpg( pgid, SIGTERM );
sleep( 20 );
}
}
printf( "[%d:%d] exiting\n", getpid(), getpgrp());
exit( 1 );
}
答案 1 :(得分:0)