C 当pthread退出时,如何防止进程退出?

C 当pthread退出时,如何防止进程退出?,c,linux,multithreading,sockets,pthreads,C,Linux,Multithreading,Sockets,Pthreads,我正在用C编写一个服务器程序,每次客户端连接时,我都会创建一个新的pthread来处理客户端的请求 然而,当所有线程都退出时,我的程序就会退出,就像调用了exit一样。这是一个问题-我如何克服它 假设服务器正在运行,2个客户端正在连接。一旦这些客户机断开连接(从而两个线程都退出),我的服务器进程就会退出。我想要的是我的服务器继续接受套接字请求。通常,当我使用fork和accept时,这会起作用。我做错了什么,导致父进程终止而不是无限循环 代码基本上如下所示: void *talker( void

我正在用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都没有成功,但我认为我应该尝试一下线程,因为共享地址空间非常简单


此外,这段代码的大部分都取自这里:

如果您在gdb中调试它,您将看到您得到一个SIGPIPE,而您的程序无法处理它。您可以安装SIGPIPE处理程序,也可以忽略SIGPIPE

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

signal(SIGPIPE, SIG_IGN);

或处理信号管。这与两个客户端的连接无关,如果在客户端断开连接后等待4秒钟,您将得到一个SIGPIPE。

啊,在gdb中,我确实注意到了一个SIGPIPE,但我一直无法弄清楚这是为什么。我没有意识到,如果不检查这是一个不完整的程序,那将是灾难性的。非常感谢你!