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

时间:2009-02-24 07:24:12

标签: c linux multithreading sockets pthreads

我正在用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失败,但我认为我会给线程一个旋转因为共享地址空间的简单性。

Using pipes in C for parent-child IPC makes program block

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

1 个答案:

答案 0 :(得分:3)

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

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

signal(SIGPIPE, SIG_IGN);

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