进程间通讯(3)—信号量&管道
来源:互联网 发布:团队协作工具知乎 编辑:程序博客网 时间:2024/06/07 06:20
信号量:相当于资源计数器,涉及到PV操作,用于进程间的同步,当进程
管道:(这里指有名管道)顾名思义,连接两个进程的通道,相当于进程之间的共享通道,进程可以在这里“存”东西,也可以“取”东西,但是取东西的前提是管道中有东西,就是说,当一个进程想打开一个空的管道文件时进程就会堵塞。
例子:初始信号量为0,
B进程p操作堵塞
A进程:用户输入OK时 V操作——> B进程输出:我准备好了,打开
管道文件 ,但是这时并没有读写操
作,B进程堵塞
用户输入sq时,在管
道文件中写入数据———–>B进程继续运行输出1~100素数
//A进程void main(){ sem_get(1234);//A、B进程控制同一个信号量 printf("A进程开始:\n"); while(1) { printf("please input:\n"); char buff[128]={0}; fgets(buff,128,stdin); buff[strlen(buff)-1]=0; if(strncmp(buff,"ok",2)==0) { sem_v(); } else if(strncmp(buff,"sq",4)==0) { int fd=open("FIFO",O_WRONLY); assert(fd!=-1); write(fd,"begin",5); } }}
//B进程void main(){ sem_get(1234); printf("B进程开始:\n"); while(1) { sem_p();//资源为0 阻塞等待A进程中的v操作的执行 printf("我准备好了\n"); int fd=open("FIFO",O_RDONLY);//管道阻塞 assert(fd!=-1); char buff[128]={0}; read(fd,buff,127); if(strncmp(buff,"begin",5)==0)//判断从管道中读取的数据是否为“begin” { printf("我开始计算100以内素数\n"); 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); } } } }}
注意问题:在调试程序时,要及时删除进程中的信号量,一面对下次测试造成影响,由此也可看出信号量集的释放与函数体的结束没有关系,要用sem_del去删除
阅读全文
0 0
- 进程间通讯(3)—信号量&管道
- 进程间通讯(二) 无名管道 & 信号量
- 进程间通讯——管道(有名管道)
- 进程间通讯—管道
- delphi 进程间通讯(管道通讯)
- 进程间通讯:信号量
- 进程间通讯--信号量
- 进程间通讯--管道
- 进程间通讯:管道
- 进程间通讯--管道
- Linux进程间通信(一)——管道、信号量
- Linux进程间通信(一)——管道、信号量
- Linux进程间通信(一)——管道、信号量 .
- 进程间通讯 (3)-信号量相关函数
- 进程间通讯——信号量(一)
- 进程间通讯——信号量
- 进程间通讯——信号量
- 进程间通讯——信号量
- 数据结构实验之串一:KMP简单应用
- Linux下Zookeeper设置开启自启动
- 弹出模态ViewController、UIModalPresentationStyle和UIModalTransitionStyle
- H264去块效应滤波分析
- 集体智慧编程_jaccard相似度实现
- 进程间通讯(3)—信号量&管道
- LINTCODE——将表达式转换为逆波兰表达式
- P1351 联合权值
- webservice 接口测试demo
- hyperic-sigar 获取全面的系统信息
- Mock方法介绍
- 公司eclipse项目迁移到android studio
- Django中请求的生命周期
- 树上三角形(斐波那契数列神奇应用)