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;
    }


  • 相关阅读:
    win10 uwp 弹起键盘不隐藏界面元素
    win10 uwp 存放网络图片到本地
    win10 uwp 存放网络图片到本地
    sublime Text 正则替换
    sublime Text 正则替换
    win10 uwp 绘图 Line 控件使用
    win10 uwp 绘图 Line 控件使用
    AJAX 是什么?
    什么是 PHP SimpleXML?
    PHP XML DOM:DOM 是什么?
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7248715.html
Copyright © 2011-2022 走看看