进程间通信(3)-信号量的使用
来源:互联网 发布:软件英文怎么说 编辑:程序博客网 时间:2024/06/08 22:27
上节课对信号量的相关函数semget() semctl() semop()做了了解(换不是很理解)这里用一个小例子来运用这三个函数进一步对信号量进行了解
目标实现:AB 进程使用同一信号量,
初始化型号量为0,
————-> B进程先进行p操作,
当用户输入OK时,
进行v操作, ———– > B进程输出1~100素数
PV操作相当一个计数器,将系统资源与当前资源做对比,当 系统资源大于等于我所需要的资源 ,我的进程就可以运行,如果不满足就堵塞, (比如说,你来的时候,资源数为1,而你恰好需要一个资源,那此时你得到了该资源,然后资源数变为1,我来的时候,资源数就是0了,但是我需要1个资源,资源不足,那我就会阻塞,直到信号量的值大于等于我需要的资源数,我才会被唤醒)
信号量的创建和相关操作的封装
void sem_get()//创建信号量集{ semid = semget((key_t)1234, 1, 0664); if(semid == -1) { semid = semget((key_t)1234, 1, 0664 | IPC_CREAT); assert(semid != -1); union semun v; v.val = 0; semctl(semid, 1, SETVAL, v); }}void sem_p()//p操作{ struct sembuf op; op.sem_num = 0; op.sem_op = -1; op.sem_flg = SEM_UNDO; semop(semid, &op, 1);}void sem_v()//v操作{ struct sembuf op; op.sem_num = 0; op.sem_op = 1; op.sem_flg = SEM_UNDO; semop(semid, &op, 1);}void sem_del()//删除信号{ semctl(semid, 0, IPC_RMID, NULL);}
A进程
void main(){ sem_get(1234); printf("A start\n"); char ar[100]={0}; while(1) { printf("input:");fflush(stdout); fgets(ar,100,stdin); if(strncmp(ar,"OK",2)==NULL) { sem_v(); } if(strncmp(ar,"end",3)==NULL) { exit(0); } }}
B进程
void main(){ sem_get(1234); printf("B start\n"); sem_p(); int i=1; for(;i<100;++i) { int j=2; for(;j<i;++j) { if(i%j==0)break; } if(i==j || i==1) printf("%d ",i); } printf("\n");}
阅读全文
0 0
- 进程间通信(3)-信号量的使用
- 进程间的通信---(二)信号量
- 进程间通信(3)--信号量
- Linux进程间通信(3)--信号量
- 进程间通信(3) - 信号量
- Linux进程间的通信,信号量的使用,生产者消费者
- Linux进程间的通信,信号量的使用,生产者消费者
- Linux进程间的通信方式:信号量的使用
- 进程间通信 "共享内存" 与 “信号量”的使用
- 进程间通信(信号量通信)
- (转)Linux进程间通信——使用信号量
- Linux进程间通信—使用信号量
- Linux进程间通信--使用信号量
- linux 进程间通信 使用信号量
- 进程间通信 信号量
- 进程间通信--信号量
- 进程间通信-信号量
- 进程间通信-信号量
- 木乃伊迷宫(改)
- 171013 PIL-Modes
- 动态加载图片
- java类集---Map接口
- 关于响应式网站做的笔记
- 进程间通信(3)-信号量的使用
- Problem G. Rectangular Polygon(dp + 转移重现)
- 40个Java多线程问题总结
- 笔记本突然开不了机了
- HDOJ2029_Palindromes _easy version
- 弱联网与强联网之间的区别
- (1)建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。 (3)写出对用二叉链表存储的二叉树进行层次遍历算法。 (4)求二叉树的所有叶子及结点总数。
- Android 属性动画(Property Animation) 完全解析
- Postman用法简介