これは私のコードのスニペットです:
signal (SIGINT, ( void *)sig_handler);
while(1){
newsockd = -1;
memset(&cli_addr, 0, sizeof(cli_addr));
if((newsockd = accept(sockd, (struct sockaddr *) &cli_addr, (socklen_t *) &socket_len)) < 0){
perror("Errore nella connessione\n");
onexit(newsockd, sockd, 0, 2);
}
fprintf(stdout, "Ricevuta richiesta di connessione dall' indirizzo %s\n", inet_ntoa(cli_addr.sin_addr));
child_pid = fork();
if(child_pid < 0){
perror("Fork error");
onexit(newsockd, sockd, 0, 2);
}
if(child_pid == 0){
do_child(newsockd);
exit(0);
}
else{
while(waitpid(child_pid, NULL, WNOHANG) > 0)
continue;
}
}
}
および関数 sig_handler:
void sig_handler(const int signo, const int sockd, const int newsockd){
if (signo == SIGINT){
printf("Received SIGINT, exiting..\n");
if(newsockd) close(newsockd);
if(sockd) close(sockd);
exit(EXIT_SUCCESS);
}
}
sighandlerが複数回呼び出されるため、「CTRL + C」を押すと問題が発生します。
例:
- サーバーはリッスンしています。
- 2 x 接続が受信されました。
- 2 x 子供用フォーク;
- 2 x 子は閉じています。
- サーバーを閉じたいので、CTRL + Cを押します。
予想される出力:
received SIGINT, exiting....
実際の出力:
received SIGINT, exiting....
received SIGINT, exiting....
received SIGINT, exiting....
なぜこのような動作になったのですか?
編集:コードが更新されました
これは、1つのフォークが完了し、子が終了したときにサーバーを閉じたときに起こることです:
^C7518
7516
Received SIGINT, exiting...
Received SIGINT, exiting...
exit(0)
解決策が見つかりました: 問題は、命令の後に書いていないことでしたdo_child()
...コードが更新されました!