gpt4 book ai didi

c - 多次调用 sigint 而不是一次 (C)

转载 作者:行者123 更新时间:2023-12-02 17:47:54 25 4
gpt4 key购买 nike

这是我的代码片段:

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);
}
}

当我按下“CTRL+C”时出现问题,因为 sighandler 被调用了多次。
示例:

  1. 服务器正在监听;
  2. 收到 2 个连接;
  3. 2 x child fork ;
  4. 2 x child 被关闭;
  5. 现在我想关闭服务器,所以我按 CTRL+C;

预期输出:
received SIGINT, exiting....
真实输出:
received SIGINT, exiting....
received SIGINT, exiting....
received SIGINT, exiting....

为什么我有这种行为?

编辑:代码已更新
这是当 1 个 fork 完成并且当 child 完成时我关闭服务器时发生的情况:

^C7518
7516
Received SIGINT, exiting...
Received SIGINT, exiting...

找到解决方案:问题是我没有写 exit(0)指令后 do_child() ...代码已更新!

最佳答案

信号发送给当前进程的每一个子进程。
在您的代码中,当您使用 fork 时,您会创建一个从主进程继承 SIGINT 处理程序的子进程。这就是多次打印消息的原因。

关于c - 多次调用 sigint 而不是一次 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12277551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com