我正在用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/
答案 0 :(得分:3)
如果你在gdb中调试它,你会看到你正在获得一个程序无法处理的SIGPIPE。您可以安装SIGPIPE处理程序或忽略SIGPIPE。
原因是你的线程正在写入已经关闭的套接字(管道)(由客户端),这会引发一个SIGPIPE。您应该在忽略SIGPIPE之后检查write()
的返回值:
signal(SIGPIPE, SIG_IGN);
或处理SIGPIPE。它与2个客户端连接无关,如果在客户端断开连接后等待4秒,您将获得一个SIGPIPE(在您的情况下)。