求利用命名信号量控制文件访问的问题

Leo_red 2012-03-09 09:35:36
最近写一个动态库,Linux下。需要读写指定格式的文件的进程都会加载,所以为了控制不同进程对同一个文件并发操作的错误就利用命名信号量机制实现进程间同步。
正行情况下运行好的,但是有时候发现,个别进程会因为我的动态库阻塞在读写文件上。
出问题时,检查了命名信号量的文件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;
}

...全文
90 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leo_red 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]

进程是阻塞在信号灯上,还是阻塞在文件读写上?
[/Quote]

没有详细的打印,按照代码来看是先wait了然后再去读写文件。
也就是说,如果是阻塞在读写文件的话,信号灯也应该是0
但是我在/dev/shm/下面检查信号灯的文件是1,就是不阻塞的状态。

justkk 2012-03-09
  • 打赏
  • 举报
回复
进程是阻塞在信号灯上,还是阻塞在文件读写上?

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧