有关信号量的问题
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网络编程系统的源码没看过。