【问题标题】:Signals termination handler and cleanup actions信号终止处理程序和清理操作
【发布时间】:2013-03-11 20:24:42
【问题描述】:

我必须管理以下信号:SIGHUPSIGINTSIGQUITSIGTERM 下面的代码是一个带有SIGHUP的例子:

int sock_ds, acc_sock_ds; //TCP sockets

void shutdown(int sig){
    close(sock_ds);
    close(acc_sock_ds);
    raise(sig);
}

/*Sets the disposition of a signal
 * Returns 0 on success, -1 on error */
int sig_disp(int sig, void (* handler)(int), int flag){
    struct sigaction sa;
    memset((char *)&sa, 0, sizeof(sa));
    sa.sa_handler = handler;
    sa.sa_flags = flag;
    sigemptyset(&sa.sa_mask);
    return sigaction(sig, &sa, NULL);
}
int main(){

    /*...*/

    /*--- Signal management ---*/
    sigset_t set;
    /*sigset filling with all signal*/
    if(sigfillset(&set) == -1){
        fprintf(stderr, "Signal set fill error\n");
        exit(EXIT_FAILURE);
    }

    /*...*/ 

    if(sigdelset(&set, SIGHUP) == -1){
        fprintf(stderr, "Signal set action error\n");
        exit(EXIT_FAILURE);
    }

    /*...*/

   /*Changing signals disposition*/
   if(sig_disp(SIGHUP, shutdown, SA_RESETHAND));

   /*...*/

   /*Remaining signals are inserted into process signal mask (blocked) */
   if(sigprocmask(SIG_BLOCK, &set, NULL) == -1){
       fprintf(stderr, "Process signal mask action error\n");
       exit(EXIT_FAILURE);
   }

   /*...*/
}

我的想法是重新激活信号的默认处理,即终止进程并在清理操作后重新引发相同的信号。

如何使用sa.sa_handler = handler;sig 传递给关机功能?

此外,在这些情况下,通常会采取哪些清洁措施?我的场景是带有 TCP 套接字和一些打开文件的单线程服务器。

【问题讨论】:

    标签: c signals handler termination


    【解决方案1】:

    不需要在退出时关闭套接字、文件、任何东西或释放内存。无论如何,操作系统都会这样做,你只是在浪费时间做两次。

    要终止只需使用

    exit(0);
    

    要将信号处理程序重置为原始处理程序,而不是将 sigaction 的最后一个参数设置为 NULL,您必须传递一个指针,该指针将设置为前一个处理程序的地址。

    当你使用signal改变handler时,它会返回前一个handler的指针

    【讨论】:

      【解决方案2】:

      当您说“管理以下信号”时,您想达到什么目的?

      如果只是在收到通常会终止进程的信号后进行一些自定义清理,您可以使用对 atexit 的调用来注册清理函数。

      【讨论】:

      • 是的,我只需要进行清理和终止,但这必须从信号处理程序中完成
      • 因为这种终止只能在终止信号的情况下发生。
      • 法比奥,您指的是哪种终止方式? INTTERM 等信号的默认处理程序是正常关闭进程。这意味着关闭所有文件描述符并正确退出。信号仍然参与其中,您不必直接处理它们。
      • 我不知道。这是一个 TCP 单线程服务器的教学实现,我必须在其中管理终止信号。在这一点上,我无法想象为什么。
      • 信号的默认行为是导致"Abnormal termination of the process",因此通过atexit注册的处理程序被调用。
      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多