如何从另一个子进程中杀死/通知其他子进程?

时间:2020-04-27 02:09:37

标签: c++ c process kill

我很难弄清楚在子进程中使用kill(pid_t pid, int sig)函数的工作方式。在我的程序中,我有一个父级,以及用fork()创建的8个子进程。我一直在网上搜索和阅读,但无济于事。所有搜索到的有关杀死父进程中的子进程的结果。

我在每个进程中都设置了信号处理程序,但它们不能正常工作。

基本上,我需要从子进程“ signal_generating_process”中发出进程组中的所有进程的信号,但是由于某些原因,信号无法正确通过。

在手册页上,kill(2)表示,如果我将0用作第一个参数,它将把信号发送到进程组中的所有进程,但对我来说不能正常工作。我将包括信号发生器的代码以及信号处理程序之一。如果我没有足够的信息,请随时询问更多信息。非常感谢大家!

void signal_generating_process(){
    signal(SIGINT, end_process_handler);
    block_sigusr1();
    block_sigusr2();
    while(true){
        millisleep(randomFloat(.01,.1)); //function I created to sleep for a certain amount of milliseconds
        int sig = rand_signal(); //randomly picks between sigusr1 and sigusr2
        kill(0, sig);
        if(sig == SIGUSR1){ //adds to a counter for sigusr1
            pthread_mutex_lock(&shm_ptr->mutex1_sent);
            shm_ptr->SIGUSR1_sent++;
            pthread_mutex_unlock(&shm_ptr->mutex1_sent);
        }
        else{ //signal == SIGUSR2 - adds to a counter for sigusr2
            pthread_mutex_lock(&shm_ptr->mutex2_sent);
            shm_ptr->SIGUSR2_sent++;
            pthread_mutex_unlock(&shm_ptr->mutex2_sent);
        }
    }
}

处理sigusr1和信号处理程序的过程(sigusr2相同):

void sigusr1_receiving_process(){
    block_sigusr2();
    signal(SIGUSR1, sigusr1_handler);
    signal(SIGINT, end_process_handler);
    while(true){
        sleep(1);
    }
}
void sigusr1_handler(int signal){
    printf("Signal 1 Received\n");
    if(signal == SIGUSR1){
        pthread_mutex_lock(&shm_ptr->mutex1_received);
        shm_ptr->SIGUSR1_received++;
        pthread_mutex_lock(&shm_ptr->mutex1_received);
    }
}

当这些循环通过时,在整个执行过程中绝不会打印“收到信号1”。您能告诉我的任何明显与我处理信号方式有关的错误吗?

编辑:我解决了我的问题!不幸的是,这与我上面没有任何关系,因此对于以后发现此问题并寻求答案的人们,我深表歉意。

无论如何,如果您偶然发现它,也许它与阻止信号的方式有关。我在父进程中错误地阻止了信号,因此它们转移到了子进程中。如果您遇到此问题,请检查您如何阻止信号。

0 个答案:

没有答案