zoukankan      html  css  js  c++  java
  • UNIX网络编程卷1 server程序设计范式1 并发server,为每一个客户请求fork一个进程

    本文为senlie原创。转载请保留此地址:http://blog.csdn.net/zhengsenlie


    1.传统并发server调用 fork 派生一个子进程来处理每一个客户
    2.传统并发server的问题在于为每一个客户现场 fork 一个子进程比較耗费 CPU 时间。


    /* include serv01 */
    #include	"unp.h"
    
    
    int
    main(int argc, char **argv)
    {
    	int					listenfd, connfd;
    	pid_t				childpid;
    	void				sig_chld(int), sig_int(int), web_child(int);
    	socklen_t			clilen, addrlen;
    	struct sockaddr		*cliaddr;
    
    
    	//1.利用 Tcp_listen 创建 TCP 套接字 --> 协议无关。IPv4 和 IPv6 都适用 
    	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: serv01 [ <host> ] <port#>");
    	cliaddr = Malloc(addrlen);
    
    
    	//2.设置垂死的子进程产生的 SIGCHLD 信号的捕获函数
    	//设置键入中断键产生的 SIGINT 信号的捕获函数
    	Signal(SIGCHLD, sig_chld);
    	Signal(SIGINT, sig_int);
    
    
    	//3.等待客户连接
    	for ( ; ; ) {
    		clilen = addrlen;
    		//3.当捕获 SIGCHLD 信号后返回时,必须处理被中断的系统调用。处理的操作是直接忽略。继续回到等待客户连接的循环中 
    		if ( (connfd = accept(listenfd, cliaddr, &clilen)) < 0) {
    			if (errno == EINTR)
    				continue;		/* back to for() */
    			else
    				err_sys("accept error");
    		}
    
    
    		//调用 fork 为每一个客户连接派生一个子进程
    		if ( (childpid = Fork()) == 0) {	/* 子进程 */
    			Close(listenfd);	/* 关闭监听套接字 */
    			web_child(connfd);	/* process request */
    			exit(0);
    		}
    		Close(connfd);			/* 父进程,关闭已连接套接字 */
    	}
    }
    /* end serv01 */
    
    
    /* include sigint */
    // SIGINT 处理函数
    void
    sig_int(int signo)
    {
    	void	pr_cpu_time(void);
    
    
    	//统计运行时间
    	pr_cpu_time();
    	exit(0);
    }
    /* end sigint */
    
    
    // SIGCHLD 处理函数
    void
    sig_chld(int signo)
    {
    	pid_t	pid;
    	int		stat;
    
    
    	//回收子进程资源 
    	while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
    		/* printf("child %d terminated
    ", pid); */
    	}
    	return;
    }


  • 相关阅读:
    isalnum()方法
    index()方法
    find()方法
    expandtabs()方法
    endswith()方法
    encode()方法
    bytes.decode()方法
    count()方法
    center()方法
    capitalize()方法
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7248715.html
Copyright © 2011-2022 走看看