【问题标题】:How to kill a child process by the parent process?如何被父进程杀死子进程?
【发布时间】:2011-09-23 23:56:10
【问题描述】:

我使用fork() 创建了一个子进程。如果子进程无法在 30 秒内完成执行,父进程如何杀死子进程?我想让子进程最多执行 30 秒。如果超过 30 秒,父进程将杀死它。你有什么想法吗?

【问题讨论】:

    标签: c fork kill


    【解决方案1】:

    向它发送 SIGTERM 或 SIGKILL:

    http://en.wikipedia.org/wiki/SIGKILL

    http://en.wikipedia.org/wiki/SIGTERM

    SIGTERM 是礼貌的,它让进程在运行之前进行清理,而 SIGKILL 用于当它不听的时候>:)

    shell 示例(手册页:http://unixhelp.ed.ac.uk/CGI/man-cgi?kill

    杀死 -9 pid

    在 C 中,您可以使用 kill 系统调用来做同样的事情:

    kill(pid, SIGKILL);
    

    请参阅以下手册页:http://linux.die.net/man/2/kill

    【讨论】:

      【解决方案2】:

      在父进程中,fork()的返回值是子进程的进程ID。当您需要终止子进程时,将该值放在某个地方。 fork() 在子进程中返回零(0)。

      当你需要终止子进程时,使用 kill(2) 函数和 fork() 返回的进程 ID,以及你希望传递的信号(例如 SIGTERM)。

      记得在子进程上调用 wait() 以防止任何逗留的僵尸。

      【讨论】:

        【解决方案3】:

        试试这样的:

        #include <signal.h>
        
        pid_t child_pid = -1 ; //Global
        
        void kill_child(int sig)
        {
            kill(child_pid,SIGKILL);
        }
        
        int main(int argc, char *argv[])
        {
            signal(SIGALRM,(void (*)(int))kill_child);
            child_pid = fork();
            if (child_pid > 0) {
             /*PARENT*/
                alarm(30);
                /*
                 * Do parent's tasks here.
                 */
                wait(NULL);
            }
            else if (child_pid == 0){
             /*CHILD*/
                /*
                 * Do child's tasks here.
                 */
            }
        }
        

        【讨论】:

        • 如果孩子在 30 秒前执行,我是否需要在父部分重置警报 (alarm(0))?
        • @miraj 您好,您有取消闹钟的解决方案吗?我有一个类似的问题,我写了一个套接字客户端/服务器,当套接字客户端要求连接时,服务器分叉一个子进程,但是如果孩子在 1 分钟内没有发送任何消息,服务器将杀死子进程。如果客户端向服务器发送消息,定时器将重新设置为 1 分钟。
        猜你喜欢
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        相关资源
        最近更新 更多