【问题标题】:'kill -9 process ID' signal handler'kill -9 进程 ID' 信号处理程序
【发布时间】:2015-01-31 09:11:39
【问题描述】:

我开发了一个程序,它在 http 服务器中使用 tcp 套接字与客户端通信。 我使用以下代码来创建 http 服务器:

void http_server_init(void)
{
    struct sockaddr_in server;
    int cr_port;

    for(;;) {
        cr_port = conf.port;
        int i = (DEFAULT_PORT == cr_port)? 1 : 0;
        //Create socket
        cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
        if (cr_socket_desc == -1)
        {
            LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
            sleep(1);
            continue;
        }

        /* enable SO_REUSEADDR */
        int reusaddr = 1;
        if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) {
            LOG (WARNING,"setsockopt(SO_REUSEADDR) failed");
        }

        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        for(;;i++) {
            server.sin_port = htons(cr_port);
            //Bind
            if( bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
            {
                //print the error message
                LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno));
                cr_port = DEFAULT_PORT + i;
                LOG (INFO,"Trying to use another port: %d", cr_port);
                continue;
            }
            break;
        }
        break;
    }
    LOG (INFO,"server initiated with the port: %d", cr_port);
}

如果程序退出,我会关闭套接字。

如果我的程序正常停止,我使用套接字关闭功能(/etc/init.d/myprog stop)

close(cr_socket_desc);

但是当使用kill -9 PID of my program 停止我的程序时,我使用以下代码:

    void signal_handler(int signal_num)
    {
        close(cr_socket_desc);
        _exit;
    }
    void main()
    {

     ....

    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_handler = signal_handler;
    sigaction(SIGINT,  &act, 0);
    sigaction(SIGTERM, &act, 0);
    sigaction(SIGKILL,  &act, 0);
    sigaction(SIGSTOP, &act, 0);

   ......

   }

但是套接字没有关闭,因为它被另一个服务占用了。

问题是如何处理kill -9 信号以及如何捕获它?

【问题讨论】:

    标签: c sockets signals kill


    【解决方案1】:

    Kill -9 发送一个 SIGKILL,您无法捕捉或忽略它。 (见http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html)。

    您也不能使用 sigprocmask() 阻止 SIGKILL。任何这样做的尝试都将被忽略。

    您无法捕获这些 SIGKILL 的事实意味着您的程序在收到 SIGKILL 时根本没有机会运行任何代码。 SIGKILL 是操作系统以极端偏见杀死您的进程的一种方式。

    您没有说明为什么要使用 kill -9 来杀死您的进程。如果这是你自己做的事情,你应该尝试发送一个不同的信号(SIGTERM 会很好,这是 kill 默认发送的,没有任何参数指定不同的信号号)。这将调用您的信号处理程序并允许您干净地关闭您的套接字。

    如果你的程序真的卡住了,而且你确实需要使用 kill -9 来摆脱它,那么根本没有办法执行任何干净的关闭。

    【讨论】:

      【解决方案2】:

      你无法捕捉或忽略这些信号,

      SIGKILL 和 SIGSTOP

      因此,您可以使用 sigprocmask() 阻止该信号。

      int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
      

      【讨论】:

      • 我不想屏蔽这些信号 SIGKILL 和 SIGSTOP !!
      • 还有其他方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多