杀死运行系统shell命令的子进程

时间:2014-04-17 21:23:58

标签: c linux ipc

在我的父进程中,我创建了一个执行系统的子进程(" find / -print")。 从父内部开始,当我尝试使用kill(childProcPID,SIGTERM)来杀死这个子进程时,它不会立即终止。 system命令继续在控制台上打印输出。

以下是示例代码:

int main(void) {

    pid_t childProc = fork();
    switch (childProc) {
    case -1:
        perror("fork() error");
        exit(EXIT_FAILURE);
    case 0:
        system("find / -print");
        printf("if I use kill(pid, SIGTERM) control doesnt reach here");
        exit(EXIT_SUCCESS);
    default:
        ;
        int i = 500000;

        //No a great way to put sleep
        //but its just temp
        while (i != 0) {
            --i;
        }

        kill(childProc, SIGTERM);
        break;
    }

    printf("Exit!!!!!!");
    return EXIT_SUCCESS;
}

请让我知道我做错了什么,或者是杀死孩子的正确方法?

3 个答案:

答案 0 :(得分:4)

system函数本身会创建一个子进程来执行命令(然后阻塞直到该子进程终止)。您所做的就是杀死调用system的子进程,但不会杀死system生成的子进程。

答案 1 :(得分:2)

尝试设置会话ID并取消进程组(man 2 kill)

int main(void) {

pid_t childProc = fork();
switch (childProc) {
case -1:
    perror("fork() error");
    exit(EXIT_FAILURE);
case 0:
    setsid();
    system("find / -print" );
    printf("if I use kill(pid, SIGTERM) control doesnt reach here");
    exit(EXIT_SUCCESS);
default:
    sleep(1);
    kill(childProc*-1, SIGTERM);
    break;
}

printf("Exit!!!!!!");
return EXIT_SUCCESS;
}

这或多或少的作品。需要注意的是,父母必须将孩子的时间交给setsid(),因此需要睡觉。

希望有所帮助。

答案 2 :(得分:1)

首先,您应该检查从kill()返回的结果 - 如果您返回0,则操作成功。但是,如果你得到-1,请检查全局变量errno以查看问题所在。

如果信号发送成功,您唯一能做的就是确保您发送了您想要的信号。正如@Till在评论中指出的那样,发送SIGKILL instead of SIGTERM将更有效,因为操作系统处理前者并且目标进程无法忽略它。

无论如何,要意识到与其他进程的交互通常是一个异步过程 - 无论你做什么,目标进程都可能在kill()返回时终止。