Parent 在 parent 创建信号后使用信号杀死 n children

Parent killing n children using signals after parent creates them

我正在尝试从 parent 进程创建 n child 个进程,然后在创建 n children 之后,parent 必须通过一个使用信号。

当parent杀死一个child时,parent必须等待2秒才能杀死下一个。最后,当 parent 杀死所有 children 时, parent 也必须完成。

每个 child 创建时都必须打印其进程 ID,直到 parent 终止它。我试图结合我从各种网站上读到的内容,到目前为止,我能够创建 children 并打印它们的进程 ID,但我无法使用信号杀死它们。我该怎么做?

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

void handle_sigint(int sig) { 
    signal(sig,handle_sigint);
    exit(0);
} 

int main(int argc, char *argv[]) {
    char *ptr=argv[1];
    int n=atoi(ptr);//number of processes to be created
    pid_t p[n];

    for(int i = 0; i < n; i++) {  
        signal(SIGINT, handle_sigint);    
        if ((p[i] = fork()) == 0) {
            while(1) 
                printf("%d %d\n",getpid(),i);                   
        } 
        sleep(2);                                
    }

    for (int i = 0; i < n; i++) {
        kill(p[i],SIGINT);
        sleep(2);
    }

    for (int i = 0; i < n; i++) {
        wait(NULL);
    }

    return 0;
}

首先,您不需要信号处理程序,因为有许多信号的默认操作是导致接收进程终止。事实上,您已经在使用的 SIGINT 就是其中之一,但 SIGTERM 将是更合适的选择。我会通过摆脱处理程序及其注册来简化,我会让父级发送 SIGTERM 而不是 SIGINT.

如果您确实保留了信号处理程序,那么您应该使用 sigaction(), not signal(), to register it, and you should omit the re-registration from the handler implementation, as proper use of sigaction() makes it unnecessary. Also, signal handlers are permitted to call only async-signal-safe functions,而 exit() 不是其中之一。您可以改用 _exit()_Exit(),但同样,完全删除处理程序会更简单。

尽管如此,我还是倾向于怀疑原始代码失败的原因是信号处理程序的签名不正确,您在编辑中更正了这一点。处理程序调用 exit() 仍然是错误的,但在实践中,产生的未定义行为的表现很可能包括程序终止。