ここに私のフォークサーバーコードの一部があります:
signal (SIGINT, ( void *)sig_handler);
while(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);
}
else{
attended_pid = waitpid(child_pid, NULL, 0);
if(attended_pid != child_pid){
printf("Child error");
}
}
}
私の質問は、クライアントを実行する前にメインソックス(sockd)を閉じる必要がありますか?
私はノーだと思います:
- 「sigintコントローラー」を追加しました。サーバーでCTRL-Cを押すと(コメント付きのsockd->
//close(sockd);
)、sigintは2つの同時接続で3回実行されます(なぜ??) - このコードを持っている場合
close(sockd)
、sigintは1回だけ実行されますが:bad file descriptor
、accept
命令を取得しました。
だから、私は何をする必要がありますか?
ありがとう!
PS:私のシギントコード:
void sig_handler(const int signo, const int sockd, const int newsockd){
if (signo == SIGINT){
printf("Ricevuto SIGINT, esco...\n");
if(newsockd) close(newsockd);
if(sockd) close(sockd);
exit(EXIT_SUCCESS);
}
}