情况:
我正在用 C 编写一个维护多个线程的程序。一旦线程结束,就会创建一个新线程。
每个线程 fork - 子线程通过 exec() 运行一个进程,父线程等待它完成。
此外,还有一个等待信号的信号处理线程。如果检测到 SIGINT,它会告诉主线程停止创建线程,这样最终所有线程都会结束,程序可以退出。
信号在所有线程中都被阻塞,当然除了信号处理程序线程。
目标:
我希望能够通过发送 SIGTERM 来终止程序。这将通过停止主线程创建新线程并终止由线程创建的正在运行的进程来实现。
问题:
如果信号在所有线程中都被阻塞,我如何向正在运行的进程发送信号以终止它们?
有什么方法可以让生成的进程只接收主程序发送的信号而不接收主程序发送的信号吗?
最佳答案
在新进程组中创建所有子进程,然后将信号发送到该组。
编辑:
这里有一些最小的代码,展示了进程如何通过信号改变它的组和控制子进程。
#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 );
}
关于c - 多线程C程序;如何杀死线程产生的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281690/