多进程并发编程----基于高级的动态创建进程池的模型

来源:互联网 发布:c语言编程界面 编辑:程序博客网 时间:2024/05/17 06:00

此篇博文主要讲解如何动态创建进程的方法,此方法模型如下:

<span style="font-size:18px;">main{  ps=socket();  bind();  listen();  while(1){    cs=accept();    if(cs){    pid=fork();    if(pid==0){//子进程处理    close(ps);    do_child(cs);    }    else{//父进程处理    .......    close(cs);    }    }  }}do_child(cs){  read();  write();  close(cs);}</span>
下面用代码介绍如何使用此种模型:

服务端程序:

<span style="font-size:18px;">#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <time.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#define BUFFLEN 1024#define SERVER_PORT 8888#define BACKLOG 5static void handle_request(int s_c){printf("process %d is being to handle client %d\n",getpid(),s_c);time_t now;/*时间*/char buff[BUFFLEN];/*收发数据缓冲区*/int n = 0;memset(buff, 0, BUFFLEN);/*清零*/n = recv(s_c, buff, BUFFLEN,0);/*接收发送方数据*/if(n > 0 && !strncmp(buff, "TIME", 4))/*判断是否合法接收数据*/{memset(buff, 0, BUFFLEN);/*清零*/now = time(NULL);/*当前时间*/sprintf(buff, "%24s\r\n",ctime(&now));/*将时间拷贝入缓冲区*/send(s_c, buff, strlen(buff),0);/*发送数据*/}/*关闭客户端*/close(s_c);}static void handle_connect(int s_s){int s_c;/*客户端套接字文件描述符*/struct sockaddr_in from;/*客户端地址*/int len = sizeof(from);/*主处理过程*/while(1){/*接收客户端连接*/s_c = accept(s_s, (struct sockaddr*)&from, &len);if(s_c > 0)/*客户端成功连接*/{/*创建进程进行数据处理*/if(fork() > 0){/*父进程*/close(s_c);/*关闭父进程的客户端连接套接字*/}else{handle_request(s_c);/*处理连接请求*/exit(0);}}}}int main(int argc, char *argv[]){int s_s;/*服务器套接字文件描述符*/struct sockaddr_in local;/*本地地址*//*建立TCP套接字*/s_s = socket(AF_INET, SOCK_STREAM, 0);int optval=1;int ret=setsockopt(s_s,SOL_SOCKET,SO_REUSEADDR,(int *)&optval,sizeof(optval));/*初始化地址接哦股*/memset(&local, 0, sizeof(local));/*清零*/local.sin_family = AF_INET;/*AF_INET协议族*/local.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/local.sin_port = htons(SERVER_PORT);/*服务器端口*//*将套接字文件描述符绑定到本地地址和端口*/int err = bind(s_s, (struct sockaddr*)&local, sizeof(local));err = listen(s_s, BACKLOG);/*侦听*//*处理客户端连接*/handle_connect(s_s);close(s_s);return 0;}</span>

客户端程序:

<span style="font-size:18px;">#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <stdio.h>#define BUFFLEN 1024#define SERVER_PORT 8888int main(int argc, char *argv[]){int s;/*服务器套接字文件描述符*/struct sockaddr_in server;/*本地地址*/char buff[BUFFLEN];/*收发数据缓冲区*/int n = 0;/*接收字符串长度*//*建立TCP套接字*/s = socket(AF_INET, SOCK_STREAM, 0);/*初始化地址接哦股*/memset(&server, 0, sizeof(server));/*清零*/server.sin_family = AF_INET;/*AF_INET协议族*/server.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/server.sin_port = htons(SERVER_PORT);/*服务器端口*//*连接服务器*/int err = connect(s, (struct sockaddr*)&server,sizeof(server));memset(buff, 0, BUFFLEN);/*清零*/strcpy(buff, "TIME");/*拷贝发送字符串*//*发送数据*/send(s, buff, strlen(buff), 0);memset(buff, 0, BUFFLEN);/*清零*//*接收数据*/n = recv(s, buff, BUFFLEN, 0);/*打印消息*/if(n >0){printf("TIME:%s\n",buff);}close(s);return 0;}</span>

此模式是最传统且最普遍常用的并发模型,那么他也存在缺陷:

1 动态创建也就是临时创建进程,会增加cpu的开销(目前此影响不怎么明显,可以通过命令ps aux| grep 进程名)

2 如果连接过多,那么就会创建更多的子进程,会受到系统为此用户分配的最大进程数的限制(例如:root用户为kevin用户设置最大开启100进程数)




1 0
原创粉丝点击