c - 带有信号捕捉器的套接字程序

标签 c sockets tcp

我试图让我的 server.c 程序能够处理僵尸进程。最初,我从 linuxhowtos.org/C_C++/socket 中找到了行 signal(SIGCHLD,SIG_IGN); .这就像一个魅力。我可以连接客户端然后关闭客户端,一切仍然顺利进行。

但是,我正在尝试用文章中所写的 SigCatcher 替换 SIG_IGN,当客户端关闭时我的服务器程序开始失控(它无限地不断接收“2”并输出)。

我已经尝试了 wait3(NULL,WNOHANG,NULL)wait(-1) 但这些都没有解决问题。我到底应该在这里做什么?

void *SignalCatcher(int n)
{
  wait3(NULL,WNOHANG,NULL);
}

这是我的 main 的样子:

   //signal(SIGCHLD, SIG_IGN);
   signal(SIGCHLD, SignalCatcher);

   for(;;)
   {
      clilen=sizeof(cliaddr);
      connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);


      if ((childpid = fork()) == 0)
      {
         close (listenfd);

         for(;;)
         {
            n = recvfrom(connfd,mesg,1000,0,(struct sockaddr*)&cliaddr,&clilen);
            write(connfd , "" , 1);
            mesg[n] = 0;
            printf("Received the following:\n");
            printf("%s",mesg);

         }

      }
      close(connfd);
   }

最佳答案

void *SignalCatcher(int n)
{
  wait3(NULL,WNOHANG,NULL);
}

应该是:

void SignalCatcher(int signum)
{
  wait3(NULL,WNOHANG,NULL);
}

返回类型在信号处理程序中非常很关键(因为调用约定与普通函数调用不同)。无论如何,编译器至少应该发出警告。

其次:在循环中,您应该处理从 recvfrom() 返回的错误。 (和写())

for(;;) {
        n = recvfrom(connfd,mesg,1000,0,(struct sockaddr*)&cliaddr,&clilen);
        if (n == -1 && errno = EAGAIN) continue;
        else if (n == 0) break; // for non-blocking sockets...
        write(connfd , "" , 1);
        mesg[n] = 0;
        printf("Received the following: %s\n", mesg);
     }

关于c - 带有信号捕捉器的套接字程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15113312/

相关文章:

sockets - 在 Go 中写入客户端 UDP 套接字

c++ - 使与 IPv6 或 IPv4 的连接变得容易?

C# TCP Socket编程——向所有套接字发送数据

tcp - 客户端发送的MSS和主机接收到的MSS不一致

c - 我如何告诉套接字在不关闭它的情况下丢弃所有未决数据?

c - malloc CPU 周期

c - C预处理器中的嵌套##运算符

C全局静态变量初始化是由链接器完成的?

c++ - 从套接字读取

c - 将指针作为局部变量的函数的汇编指令