【发布时间】:2012-09-05 07:35:44
【问题描述】:
这是我的 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 将只执行一次,但我在accept指令上得到一个:bad file descriptor。
那么,我该怎么办?
谢谢!
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);
}
}
【问题讨论】:
-
离题:
0是一个有效的套接字/文件描述符。所以你最好在使用之前和close()ed之后将未使用的套接字/文件描述符初始化为-1,然后使用-1测试它是否有效。 -
谢谢,我已经更新了我的本地代码 :)
-
在父进程中,你应该调用例如
waitpid定期为您的孩子打扫卫生。 -
谢谢 :) 我已经重新更新了我的代码,但是......我有什么要“清理”到父级的??
-
但是
multiple sigint问题仍然存在:(