本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
1.为每个客户请求创建一个线程,以取代为每个客户派生一个子进程
/* include serv06 */ #include "unpthread.h" int main(int argc, char **argv) { int listenfd, connfd; void sig_int(int); void *doit(void *); pthread_t tid; socklen_t clilen, addrlen; struct sockaddr *cliaddr; //1.创建监听套接字 if (argc == 2) listenfd = Tcp_listen(NULL, argv[1], &addrlen); else if (argc == 3) listenfd = Tcp_listen(argv[1], argv[2], &addrlen); else err_quit("usage: serv06 [ <host> ] <port#>"); cliaddr = Malloc(addrlen); //2.设置中断信号 SIGINT 的处理函数 Signal(SIGINT, sig_int); //3.主线程循环 for ( ; ; ) { clilen = addrlen; //阻塞在 accept 调用 connfd = Accept(listenfd, cliaddr, &clilen); //为新的客户连接创建一个新线程 Pthread_create(&tid, NULL, &doit, (void *) connfd); } } //新线程的执行函数 void * doit(void *arg) { void web_child(int); //1.调用 Pthread_detach 使新线程脱离主线程,这样主线程就不用等它返回 Pthread_detach(pthread_self()); //2.调用 web_child 处理客户请求 web_child((int) arg); //3.关闭已连接套接字 Close((int) arg); return(NULL); } /* end serv06 */ // SIGINT 信号处理函数 void sig_int(int signo) { void pr_cpu_time(void); pr_cpu_time(); exit(0); }
时间: 2024-10-29 10:48:07