这是我的 fork-server 代码:
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");
}
}
}
我的问题是:我必须在执行客户端之前关闭主 sock (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);
}
}