次のシグナルを管理する必要があります: 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 ソケットといくつかの開いているファイルを備えたモノスレッド サーバーです。