c - 多线程C程序;如何杀死线程产生的进程?

标签 c multithreading fork signals

情况:

我正在用 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/

相关文章:

c - 为什么我的 sig_int() 函数不能阻止我的函数在 c 中退出?

c - 在 macOS 上从 dev_t 获取设备文件系统路径

c# - 控制台应用程序触发一个进程,然后关闭自身

python - 记录多线程应用程序中的锁获取和释放调用

java - 有没有办法防止 ClosedByInterruptException?

C套接字Web服务器不在浏览器中显示html,仅发送HTTP响应

用 C 语言进行 Cgi 编程,从我的 cgi 程序中调用 system()。

c++ - 更有效地使用 fork() 和写时复制内存共享

c - 我如何在 fork(), linux 中演示 COPY ON WRITE

java - 使用 Java fork 和删除特权