2

我正在用 C 编写一个服务器程序,其中每次客户端连接时,我都会创建一个新的 pthread 来处理客户端的请求。

但是,当所有线程都退出时,我的程序就会退出,就好像调用了 exit() 一样。这是一个问题——我该如何克服它?

假设服务器正在运行,并且有 2 个客户端连接。一旦这些客户端断开连接——因此两个线程都退出了——那么我的服务器进程就会退出。我想要的是让我的服务器保持接受()套接字请求。通常这在我使用 fork() 和 accept() 时有效。我做错了什么导致父进程终止而不是无限循环?

代码看起来基本上是这样的:

void *talker( void *d ) {
   int fd;
   char buf[] = "Hello client";

   fd = (int)d;

   while( 1 ) {
      write( fd, buf, strlen( buf )+1 );
      sleep(4);
   }
}


int main( int argc, char *argv[] ) { 

   pthread_t thread[50];

   int sockfd;
   struct sockaddr_in client_addr;
   int i = 0;
   int s1;

   /* ... other declarations */

  if (initialize_server_socket(portno, &sockfd) < 0) {
     fprintf(stderr, "Could not initialize socket\n");
     exit(-1);
  }   

  while( 1 ) { 
     s1 = accept( sockfd, (struct sockaddr *)&client_addr, &n );
     pthread_create( &(thread[i++]), NULL, talker, (void *)s1 );
  }   

  return(0);
}

另外:这是我已经问过的问题的同一个项目(链接如下)......虽然在花费太多时间尝试使用 select() 和 IPC 失败后,我想我会给线程一个旋转,因为它的简单性共享地址空间。

在 C 中使用管道进行父子 IPC 会导致程序阻塞

此外,大部分代码取自这里:http ://www.s5h.net/2006/06/27/pthread-socket-server-in-c/

4

1 回答 1

3

如果你在 gdb 中调试它,你会看到你得到了一个 SIGPIPE,你的程序没有处理它。您可以安装 SIGPIPE 处理程序或忽略 SIGPIPE。

原因是您的线程正在写入已(由客户端)关闭的套接字(管道),这会引发 SIGPIPE。write()您应该检查忽略 SIGPIPE 后的返回值:

signal(SIGPIPE, SIG_IGN);

或处理 SIGPIPE。它与 2 个客户端连接无关,如果您在客户端断开连接后等待 4 秒,您将获得一个 SIGPIPE(在您的情况下)。

于 2009-02-24T07:41:44.203 回答