免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2117 | 回复: 2
打印 上一主题 下一主题

fcntl的文件锁导致写锁饿死的情况 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-10 18:00 |只看该作者 |倒序浏览
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/file.h>
#include <pthread.h>

int fdd = -1;

void lockk()
{   
&nbsp;&nbsp;&nbsp;&nbsp;if ( fdd == -1 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;printf("fd %d\n", fdd);

&nbsp;&nbsp;&nbsp;&nbsp;struct flock lock;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_type = F_WRLCK;
&nbsp;&nbsp;&nbsp;&nbsp;/*lock.l_type = F_RDLCK;*/
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_whence = SEEK_SET;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_start = 0;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_len = 0;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_pid = -1;

&nbsp;&nbsp;&nbsp;&nbsp;if ( fcntl(fdd, F_SETLKW, &lock) == -1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Lock1 err\n", strerror(errno));
&nbsp;&nbsp;&nbsp;&nbsp;}
}

void unlockk()
{
&nbsp;&nbsp;&nbsp;&nbsp;if( fdd == -1 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;printf("fd %d\n", fdd);
&nbsp;&nbsp;&nbsp;&nbsp;struct flock lock;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_type = F_UNLCK;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_whence = SEEK_SET;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_start = 0;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_len = 0;
&nbsp;&nbsp;&nbsp;&nbsp;lock.l_pid = -1;

&nbsp;&nbsp;&nbsp;&nbsp;if ( fcntl(fdd, F_SETLK, &lock) == -1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Lock1 err\n", strerror(errno));
&nbsp;&nbsp;&nbsp;&nbsp;}

}

int main(int argc, char * argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;fdd = open("/root/lltest", O_CREAT | O_RDWR);

&nbsp;&nbsp;&nbsp;&nbsp;lockk();
&nbsp;&nbsp;&nbsp;&nbsp;printf("locked\n");

&nbsp;&nbsp;&nbsp;&nbsp;printf("lock %d\n", getpid());

&nbsp;&nbsp;&nbsp;&nbsp;sleep(40);
&nbsp;&nbsp;&nbsp;&nbsp;unlockk();
&nbsp;&nbsp;&nbsp;&nbsp;printf("unlocked\n");

&nbsp;&nbsp;&nbsp;&nbsp;return -1;


}


上面的代码编译成两个程序lockrd,lockw.区别在lock.l_type,一个加读锁,一个加写锁。
按下面顺序执行程序
lockrd
lockw
lockrd
lockrd
lockrd
lockrd
lockrd

结果显示lockw一直阻塞,直到最后一个lockrd进程解锁后lockw才得以加锁,这样岂不是会饿死写锁?
有没有人遇到同样的问题啊,请多指教!!

论坛徽章:
1
双鱼座
日期:2014-08-25 19:13:11
2 [报告]
发表于 2009-07-10 23:35 |只看该作者

回复 #1 gothicane 的帖子

我的打印顺序是这样的
$ ./lockrd& ./lockw& ./lockrd&
[1] 25252
lock read  25252
[2] 25253
lock write  25253
lock read  25254
[3] 25254
unlock read 25252
unlock write 25253
unlock read 25254
不存在你说的情况阿。。。

[ 本帖最后由 fxpbupt 于 2009-7-10 23:53 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-07-13 09:15 |只看该作者

回复 #2 fxpbupt 的帖子

我用的是 ubuntu 9.04 Linux version 2.6.28-13-generic ,我在控制台下分别执行的那两个程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP