简单进程池实现代码(共享内存为通信形式)
来源:互联网 发布:mac photoshop 破解版 编辑:程序博客网 时间:2024/06/03 23:06
测试效果(代码没有测试完全可能有很多问题后面需要更改
sem.h
#include <stdio.h>#include <signal.h>#include <assert.h>#include <sys/sem.h>union semun{int val;};void sem_init();void sem_p();void sem_v();void del_sem();
sem.c
#include "sem.h"static int semid=-1;void sem_init(){semid=semget((key_t)1234,1,IPC_CREAT | IPC_EXCL |0600);//创建信号量if(semid==-1)//失败的话就进行获取保证两个进程都能获得同一个信号量{semid=semget((key_t)1234,1,0600);//获取信号量if(semid==-1){perror("erro\n");}}else{union semun a;a.val=1;if(semctl(semid,0,SETVAL,a)==-1)//添加控制信号量的信息{perror("semctl erro");}}}void sem_p(){struct sembuf a; //用当前的结构对自己定义的信号进行操作a.sem_num=0;a.sem_op=-1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){perror("erro\n");}}void sem_v(){struct sembuf a;a.sem_num=0;a.sem_op=1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){perror("error\n");}}void del_sem(){//union semun sem_union;if(semctl(semid,0,IPC_RMID)==-1){perror("erro\n");}}sem.c
#include "sem.h"#include <sys/shm.h>#include <unistd.h>#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>int shmid;typedef void (*process)(void *arg);typedef struct work1{process dealfun;void* arg;struct work1 *next;}CProc_work;typedef struct{int max_work;int num_work;int deal_work;int deal_max_work;int exit;int rdc_work;CProc_work work[20];}CProc_pool;void f(void *arg){int p=(int)arg;printf("%d\n",p);}void fun(int i){pid_t pid;int stat;while((pid==waitpid(-1,&stat,WNOHANG))>0){printf("child_proc exit\n",pid);}}void init(CProc_pool *pool){pool->max_work=10;pool->num_work=3;pool->deal_work=0;pool->exit=0;pool->rdc_work=0;pool->deal_max_work=20;int i=0;int pid;for(;i<pool->num_work;i++){pid=fork();if(pid==0){sem_init();CProc_pool *pool=(CProc_pool*)shmat(shmid,NULL,0);//printf("%d\n",pool->deal_work);CProc_work work;while(1){while(pool->deal_work==0);//需要解决方案sem_p();if(pool->deal_work!=0){printf("获取当前的任务 pid=%d\n",getpid());pool->deal_work--;work=pool->work[pool->deal_work];//获取当前的任务;}else{sem_v();continue;}printf("runing \n");work.dealfun(work.arg);sem_v();int n=rand()%3;sleep(n);}}}}void add(CProc_pool *pool,process p,void *arg){CProc_work tmp;tmp.dealfun=p;tmp.arg=arg;sem_p();pool->work[pool->deal_work]=tmp;pool->deal_work++;sem_v();}int main(){signal(SIGCHLD,fun);shmid=shmget((key_t)6666,sizeof(CProc_pool)+1,IPC_CREAT |0600);assert(shmid!=-1);sem_init();CProc_pool *pool=(CProc_pool*)shmat(shmid,NULL,0);assert(pool!=(CProc_pool*)-1);init(pool);CProc_work work;int i=0;for(;i<10;i++){while(pool->deal_work==20);add(pool,f,(void*)i);sleep(3);}shmdt(pool);}
阅读全文
0 0
- 简单进程池实现代码(共享内存为通信形式)
- Linux进程通信---共享内存 代码实现
- 进程间通信:共享内存(代码实现)
- 进程间通信之“内存共享”的简单实现
- 进程通信(共享内存)
- 共享内存(进程通信)
- linux进程通信(一)--共享内存+信号量,代码示例
- linux进程通信(一)--共享内存+信号量,代码示例
- linux进程通信(一)--共享内存+信号量,代码示例
- 撸代码--linux进程通信(基于共享内存)
- Windows 进程间通信 共享内存(FileMapping)_C#实现
- 进程通信(IPC)——实现共享内存
- 利用共享内存实现进程间通信
- 利用共享内存实现进程间通信
- 共享内存实现进程间通信
- 共享内存实现进程间通信
- 共享内存----实现进程间通信
- 利用共享内存实现进程间通信
- 后台管理UI的选择
- spring in action 学习笔记(七)注入内部bean
- Go实战--golang中操作excel(tealeg/xlsx、360EntSecGroup-Skylar/excelize)
- linux 更新node
- c# 转换json
- 简单进程池实现代码(共享内存为通信形式)
- 区间计数
- Algorithm-week6
- Fiddler教程(Web调试工具)
- HTML5新增结构元素
- c++ vector
- 进程和线程的区别
- mapreduce的任务切片规划机制、job提交流程、Mapreduce中的分区Partitioner与流量汇总程序开发
- 关于Qt Creater中资源文件和文件路径的记录