linux通信--信号量
来源:互联网 发布:sql语句 编辑:程序博客网 时间:2024/06/14 03:48
程序主要参考:http://hector.blog.51cto.com/4229131/758930
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/stat.h> #include <fcntl.h> union semun //必须自己定义{ int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; void p(int k){ sb.sem_num = k; //将k号信号量 sb.sem_op = -1; //减1 sb.sem_flg = SEM_UNDO; semop(semid, &sb, 1); //原子p操作, //semop(int semid,struct sembuf semoparray[],size_t nops)对信号量集合semid进行p操作,操作的内容在semoparray,nops表明前面数组的大小}void v(int k){sb.sem_num = k; //将k号信号量 sb.sem_op = 1; //加1 sb.sem_flg = SEM_UNDO; semop(semid, &sb, 1); //操作信号量} int main(void) { char* buf_child[]={"this", "is", "the", "child", "process"}; char* buf_father[]={"father", "say", "hello", "to", "child"}; int i = 0, semid, fd; pid_t pid; struct sembuf sb; //信号量操作 union semun sem; semid = semget(1000, 2, 0666 | IPC_CREAT); //申请信号量组,包含2个信号量 sem.val = 0; //semctl(int semid,int semnum,int cmd,union semun)对信号量集合中的第semnum号信号进行cmd操作,操作的具体数值放在semun中 semctl(semid, 0, SETVAL, sem); //初始化0号信号量为0 sem.val = 1; semctl(semid, 1, SETVAL, sem); //初始化1号信号量为1 fd=open("tmp",O_CREAT|O_TRUNC|O_WRONLY,0666); pid = fork(); switch (pid) { case -1: perror("fork fail"); break; case 0: /* child consume */ srand((unsigned int)getpid()); while (i < 5) { p(1);//child 只看1号信号量 write(fd,buf_child[i], strlen(buf_child[i])); sleep(rand()); write(fd,&" ", 1); i++; v(0); } break; default:/* parent production */ srand((unsigned int)getpid()); while (i < 5) { p(0);//parent 只看0号信号量 write(fd,buf_father[i], strlen(buf_father[i])); sleep(rand()); write(fd,&" ", 1); i++; v(1); } break; } return 0; }
- Linux进程通信--信号量
- Linux进程通信-信号量
- linux通信--信号量
- linux通信之信号量
- linux进程通信---信号量
- linux的信号量通信
- linux进程通信--信号量
- linux进程通信--信号量
- linux进程通信-信号量
- Linux进程通信-信号量
- linux进程通信-信号量使用
- Linux进程通信-使用信号量
- linux进程通信-信号量使用
- linux进程通信-信号量使用
- linux进程通信-信号量使用
- linux进程通信-信号量使用
- Linux进程通信-信号量
- linux进程间通信--信号量
- 终于把sql数据库页面检验和的算法搞清除了
- 只谈处理器 且看Apple A4到A5的进化
- android dpi换算以及常用分辨率列表
- bash shell if 命令参数说明
- 一些Objective-C学习资源
- linux通信--信号量
- c#图像处理-二值化
- Linux2.4安装一个文件系统
- 网络计算智能研究方向
- 孙鑫-MFC笔记九--菜单编程
- Struts拦截器解决表单重复提交
- Android 图片平铺实现方式
- STL有限队列的灵活运用+IO优化+区间最大最小——POJ Sliding Window
- Flex中的TextInput (6): 示例和Flex中真实的TextInput的不同