信号终止处理程序和清除操作

时间:2013-03-11 20:24:42

标签: c signals handler termination

我必须管理以下信号: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);
   }

   /*...*/
}

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

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

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

2 个答案:

答案 0 :(得分:1)

无需在退出时关闭套接字,文件,任何内容或可用内存。无论如何,操作系统都会这样做,你只是在浪费时间做两次事情。

终止只使用

exit(0);

要将信号处理程序重置为原始处理程序,而不是将最后一个参数设置为空,而不是将指针传递给将使用前一个处理程序的地址设置的指针。

当您使用 signal 更改处理程序时,它将返回上一个处理程序的指针

答案 1 :(得分:0)

当你说'管理以下信号'时,你想要实现什么目标?

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