当前位置: 技术问答>linux和unix
求利用命名信号量控制文件访问的问题
来源: 互联网 发布时间:2017-02-08
本文导语: 最近写一个动态库,Linux下。需要读写指定格式的文件的进程都会加载,所以为了控制不同进程对同一个文件并发操作的错误就利用命名信号量机制实现进程间同步。 正行情况下运行好的,但是有时候发现,个别进程...
最近写一个动态库,Linux下。需要读写指定格式的文件的进程都会加载,所以为了控制不同进程对同一个文件并发操作的错误就利用命名信号量机制实现进程间同步。
正行情况下运行好的,但是有时候发现,个别进程会因为我的动态库阻塞在读写文件上。
出问题时,检查了命名信号量的文件sem.***,发现里面是1,不是阻塞的,这很奇怪。
然后手动再次调用我的动态库读写同一个文件,发现之前锁住的进程也解锁了,我的新的访问也是成功的。
这更奇怪了,因为如果是死锁了,我的新的操作肯定也会锁在那里。
下面是创建信号量和wait的代码,因为参数检查而return的地方太多了,所以post的地方也太多了,这里不贴了。
参数里面,
OPEN_FLAG = O_CREAT
OPEN_MODE = 00644
INIT_V = 1
信号量采用要访问的文件名来命名,这样不相干的进程获取的是同一个状态,就可以实现同步。
另外,不用怀疑我是否正确调用了sem_post,因为刚才说的,进程锁住后我检查信号量文件是1,表明要么没有wait,要么是post过的。为了避免死锁,每个return的地方我都有post的。
因为该问题不是必然能重现,求熟悉内核的大大们给点思路,谢谢。
正行情况下运行好的,但是有时候发现,个别进程会因为我的动态库阻塞在读写文件上。
出问题时,检查了命名信号量的文件sem.***,发现里面是1,不是阻塞的,这很奇怪。
然后手动再次调用我的动态库读写同一个文件,发现之前锁住的进程也解锁了,我的新的访问也是成功的。
这更奇怪了,因为如果是死锁了,我的新的操作肯定也会锁在那里。
下面是创建信号量和wait的代码,因为参数检查而return的地方太多了,所以post的地方也太多了,这里不贴了。
参数里面,
OPEN_FLAG = O_CREAT
OPEN_MODE = 00644
INIT_V = 1
信号量采用要访问的文件名来命名,这样不相干的进程获取的是同一个状态,就可以实现同步。
另外,不用怀疑我是否正确调用了sem_post,因为刚才说的,进程锁住后我检查信号量文件是1,表明要么没有wait,要么是post过的。为了避免死锁,每个return的地方我都有post的。
因为该问题不是必然能重现,求熟悉内核的大大们给点思路,谢谢。
sem = sem_open((char*)basename(filename), OPEN_FLAG, OPEN_MODE, INIT_V);
if (NULL != sem)
{
ret = sem_wait(sem);
}
else
{
seterrstr("open sem failed %s, err = %s.", filename, strerror(errno));
return eOP_ERR_ERROR;
}
|
进程是阻塞在信号灯上,还是阻塞在文件读写上?
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。