进程间通信-信号量2
来源:互联网 发布:b2b源码授权费用 编辑:程序博客网 时间:2024/06/05 09:26
作业: A, B 两个进程, 首先, A 进程获取用户输入, 当 A 进程获取的用户输入是“OK”时, B 进程输出 100 以内所有的素数。
分析:
可以利用信号量实现 A,B 进程的同步, 首先, B 进程阻塞在信号量的 P 操作(信号量初始值 == 0), 当 A 进程获取到“OK” 时, 对信号量进行 V 操作。
信号量:为了协调进程对资源的访问(即资源共享)
有两个进程A和B,A触发ok时B执行输出操作:
miana.c
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <sys/sem.h>#include <string.h>#include <unistd.h>void amin(){ sem_get(); //获取或创建一个信号量 while(1) { printf("please input:"); char buff[128] = {0}; fgets(buff,127,stdin); //用户输入 if (strncmp(buff,"ok",2) == 0) //用户输入ok { sem_v(); //运行 } if (strncmp(buff,"end",3) == 0) //用户输入end { sem_p(); //阻塞 } }}
mainb.c
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <sys/sem.h>#include <string.h>#include <unistd.h>void main(){ sem_get(); sem_p(); //pv操作 printf("输出素数");}
sem.h
union semun //联合体由sem.h(程序员)定义{ int val;};void sem_get();void sem_p();void sem_v();void sem_del();
sem.cpp
#include "sem.h"void sem_get() //获取(创建)一个信号量,创建信号量时设置一个初值{ semid = sem_get((key_t)1234,0,0664); //(0664操作权限)获取 if (semid == -1) { semid = sem_get((key_t)1234,1,0664 | IPC_CREAT); //创建 assert(semid != -1); union semun sval; sval.val = 0; semctl(semid,0,SETVAL,sval);//标志号,编号,初始化,初始化的值 }}void sem_p() //阻塞操作{ struct sembuf buf; buf.sem_num = 0; //编号(操作目标的数组下标) buf.sem_op = -1; //操作 buf.sem_flg = SEM_UNDO; //标志 semop(semid,&buf,1);//标识符,操作,信号量个数}void sem_v() //运行操作{ struct sembuf buf; buf.sem_num = 0; buf.sem_op = 1; buf.sem_flg = SEM_UNDO; semop(semid,&buf,1); //对semid这个信号量指定的变量进行操作,是选择发送(+1)还是等待(-1);}void sem_del(){ semctl(semid,0,IPC_RMID); //删除信号量}
阅读全文
0 0
- 进程间通信-信号量2
- 进程间通信 信号量
- 进程间通信--信号量
- 进程间通信-信号量
- 进程间通信-信号量
- 进程间通信--信号量
- 【进程间通信】信号量
- 进程间通信----信号量
- 进程间通信:信号量
- 进程间通信-信号量
- 进程间通信-信号量
- 进程间通信--信号量
- 进程间通信--信号量
- 进程间通信---->信号量
- 进程间通信-信号量
- 进程间通信-信号量
- 进程间通信--信号量
- 进程间通信----信号量
- Python 之 基础面向对象编程
- 7-1 银行业务队列简单模拟
- HDU 2147 kiki's game 博弈论
- 二维码
- 数论小练
- 进程间通信-信号量2
- HTTP协议优秀博客推荐
- HTML5动画
- 大学生职业规范生涯
- LeetCode57 Insert Interval
- LeetCode No.233 Number of Digit One 题解
- 安装eclipse和安装jre过程中出现 An error has occurred. see the log file的我的解决办法
- java第二次作业(2)
- java