MyException - 我的异常网
当前位置:我的异常网» C++ » 有关信号量的有关问题

有关信号量的有关问题

www.MyException.Cn  网友分享于:2013-02-12  浏览:24次
有关信号量的问题
linux网络编程中有这样的一段代码
关于两个缓冲区同步的:
sturct sembuf p1={0,-1,0} p2={1,-1,0} v1={0,1,0} v2={1,1,0}
reader(){
for(){
buf1->dnread=read(0,d_buf1->d_buf,size);
semop(&v1)
semop(&p2)
if(buf1->dnread<0) return;
buf2->dnread=read(0,d_buf2->d_buf,size);
semop(&v2);
semop(&p1);
if(buf2->d_nread<0) return
}

write(){
for(){
semop(&p1);
if(buf1->dnread<0) return;
write(buf1->dbuf);
semop(&v1);
semop(&p2);
if(buf2->d_nread<0) return
semop(&v2);
}
}
}
手打的所以省略了一些参数等但意思是这样,它的作用是读写两个缓冲区同步,但是其间有好多return,信号量不是应该成对出现吗,return了后另一端不就阻塞掉了,几天了没有理解这个意思,希望高手帮忙说一下流程,我是新手,感谢

------解决方案--------------------
linux不懂,但是这个程序中信号量不是成对出现的么?
我去看下了这个http://www.91linux.com/html/article/program/cpp/20081120/13890.html

按我的理解,这里一共有两个信号量。一个是0号,一个是一号。这两个信号量的最大资源数都是1,也就是只能有一个人获得。
其中,semop(&v1)表示获得一个0号信号量,semop(&p1)表示释放一个0号信号量。

程序中一个是读进程,一个是写进程。
写进程因为要同时知道buf1和buf2的状态,所以要得到两个信号量。




------解决方案--------------------
【semop系统调用】
 
功能描述:
操作一个或一组信号。


用法: 
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semop(int semid, struct sembuf *sops, unsigned nsops);

int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);


参数:
semid:信号集的识别码,可通过semget获取。
sops:指向存储信号操作结构的数组指针,信号操作结构的原型如下

struct sembuf
{
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};

这三个字段的意义分别为:
sem_num:操作信号在信号集中的编号,第一个信号的编号是0。
sem_op:如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。
sem_flg:信号操作标志,可能的选择有两种
IPC_NOWAIT //对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
IPC_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。

nsops:信号操作结构的数量,恒大于或等于1。
timeout:当semtimedop()调用致使进程进入睡眠时,睡眠时间不能超过本参数指定的值。如果睡眠超时,semtimedop()将失败返回,并设定错误值为EAGAIN。如果本参数的值为NULL,semtimedop()将永远睡眠等待。


------解决方案--------------------
这里定义的p1和v1,p2和v2正好各自是一对。semop的参数是v1和v2时表示释放资源,p1和p2是申请资源。
reader读第一个缓冲区之前不需等待,读完释放信号,读第二个缓冲时要等待,读完释放信号,然后在下一次循环之前等待信号p1。
writer正好相反,开始写第一个缓冲的时候先等待,写完后释放信号可以让reader读;然后写第二个缓冲类似。

reader和writer等待信号的顺序不同,reader总是先等待p2,writer先等待p1.;两个函数return的条件都相同,所以一个return后,另一个最后也就return了。
------解决方案--------------------
这个不知道,不知道这两个缓冲区是否数据有先后关系。而且看他的意思是缓冲区1读优先的,而且这里的代码没见写缓冲区2的。linux网络编程系统的源码没看过。

文章评论

 程序员的样子
程序员的样子
中美印日四国程序员比较
中美印日四国程序员比较
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员和编码员之间的区别
程序员和编码员之间的区别
鲜为人知的编程真相
鲜为人知的编程真相
10个调试和排错的小建议
10个调试和排错的小建议
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
为什么程序员都是夜猫子
为什么程序员都是夜猫子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
代码女神横空出世
代码女神横空出世
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我的丈夫是个程序员
我的丈夫是个程序员
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员的鄙视链
程序员的鄙视链
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
老程序员的下场
老程序员的下场
一个程序员的时间管理
一个程序员的时间管理
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
编程语言是女人
编程语言是女人
如何成为一名黑客
如何成为一名黑客
程序员必看的十大电影
程序员必看的十大电影
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有