0

次のシグナルを管理する必要があります: SIGHUP, SIGINT, SIGQUIT,SIGTERM 以下のコードは の例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);
   }

   /*...*/
}

私の考えは、プロセスを終了し、クリーンアップ操作の後に同じシグナルを再発生させるという、シグナルのデフォルト処理を再アクティブ化することです。

sigでシャットダウン機能に渡すにはどうすればよいsa.sa_handler = handler;ですか?

さらに、これらの場合に一般的に取られるクリーニングアクションは何ですか? 私のシナリオは、TCP ソケットといくつかの開いているファイルを備えたモノスレッド サーバーです。

4

2 に答える 2

1

ソケットやファイルなどを閉じたり、終了時にメモリを解放したりする必要はありません。とにかく、OSはそれを行います。何かを2回行うのに時間を無駄にしているだけです。

単に使用を終了するには

exit(0);

シグナル ハンドラーを元の状態にリセットするには、sigaction の最後のパラメーターを NULL に設定する代わりに、前のハンドラーのアドレスが設定されるポインターを渡す必要があります。

signalを使用してハンドラーを変更すると、前のハンドラーのポインターが返されます

于 2013-03-11T20:35:16.800 に答える
0

「次のシグナルを管理する」と言うとき、何を達成しようとしていますか?

通常はプロセスを終了させるシグナルの受信時にカスタム クリーンアップを実行するだけの場合は、atexitの呼び出しを使用してクリーンアップ関数を登録できます。

于 2013-03-11T20:33:45.710 に答える