为什么我不能用这个 c 代码杀死进程组



在主父进程中,我调用:

killpg(child_group, SIGKILL);

在子进程中,我将子组设置为:

setsid();
child_group = getpgrp();

但是我检查了进程,ps显示进程组没有被杀死。我做错了什么?

在父进程中:

killpg(child_group, SIGKILL);

你到底是怎么child_group的?

为此目的在子进程中执行以下操作毫无意义:

child_group = getpgrp();

这是因为此child_group只是子进程中的一个副本(即:父进程中的child_group不会被修改(


SIGKILL必须发送到与孩子的PID相对应的PGID,因为它通过setsid()成为进程组负责人。也就是说,作为killpg()的参数,您应该使用通过调用 fork() 返回给父进程的pid_t

确保在子项中(成功(返回setsid()之后(即:在子项成为进程组负责人之后而不是之前(,项会调用killpg()


一个最小的例子:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
void parent(pid_t pid) {
    killpg(pid, SIGKILL);
}
void child(void) {
    if (-1 == setsid())
        return;
    while(1) {
        sleep(1);
        printf("childn");
    } 
}

int main() {
    pid_t pid;
    switch ((pid=fork())) {
    case 0: // child
        child();
        break;
    default: // parent
        // wait some time to let setsid() complete
        sleep(5);
        parent(pid);
    }
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新