多进程并发编程----基于高级的动态创建进程池的模型
来源:互联网 发布: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
- 多进程并发编程----基于高级的动态创建进程池的模型
- 多进程并发编程----基于高级的预先创建进程池(accept不上锁)的模型
- 多进程并发编程----基于高级的预先创建进程池(accept使用文件上锁)的模型
- 多进程并发编程----基于高级的预先创建进程池(accept使用线程上锁)的模型
- 基于进程的并发编程
- Python基于进程的并发编程
- Java并发编程:线程、进程的创建
- 并发编程01-基于进程的并发编程
- 基于PCNTL的PHP多进程并发编程
- 并发模型编程中多进程与多进程的选择
- Java并发编程:(1)进程和线程的由来、进程的创建、线程的创建
- erlang 并发编程,spawn 创建新的进程
- 并发编程--守护进程的创建和运行
- Java并发编程:线程和进程的创建
- Java并发编程:线程和进程的创建(转)
- 一种简单的多进程编程模型
- Nginx 多进程模型是如何实现高并发的?
- fork()&&进程的创建与终止--多进程编程
- 学习心得-------计算机网络基础(1)
- CV_CAST_8U(val);的意义!
- AFNetworking 返回错误unsupported media type (415) 解决方案
- 关于Java Serial Version UID的一些说明
- 决策树分类算法之ID3
- 多进程并发编程----基于高级的动态创建进程池的模型
- 会用到的android 开发 第三方
- Python中OS模块
- iOS @synthesize和@dynamic
- 专题二 第七道题和第八道题
- 02-线性结构2 Reversing Linked List
- 一位相乘
- [SPRD]展讯平台 LCD(Mipi)移植步骤及问题归纳
- oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)