免费注册 查看新帖 |

Chinaunix

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

[Linux] 强制锁没有起作用,为什么? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-27 09:25 |只看该作者 |倒序浏览
网上的说法是,强制锁被建立的时候,其他进程要访问一个文件必须等待强制锁释放。于是我弄了一个实验:

我在我的rhel里面,用mount命令加上了mand选项:

  1. [root@localhost a]# mount -o remount, mand /
复制代码
然后我写了个一个小程序,从网上的例子改过来的:

  1. #include<stdlib.h>
  2. #include<sys/stat.h>
  3. #include<sys/types.h>
  4. #include<fcntl.h>
  5. #include<dirent.h>
  6. #include<sys/file.h>
  7. #include<unistd.h>
  8. int main()
  9. {
  10.   int fd=open("mandatory.txt",O_RDWR);
  11.   struct flock lk;
  12.   lk.l_type=F_WRLCK;
  13.   lk.l_start=0;
  14.   lk.l_whence=SEEK_SET;
  15.   lk.l_len=0;
  16.   lk.l_pid=getpid();
  17.   int flag=fcntl(fd,F_SETLKW,&lk);
  18.   printf("%d\n",flag);
  19.   getchar();//运行到这里的时候,我新开一个shell窗口
  20.   close(fd);
  21.   return 0;
  22. }
复制代码
然后测试,我建立了一个文件:

  1. touch mandatory.txt
  2. chmod g+s,g-x mandatory.txt
复制代码
运行我的程序,运行到getchar()的时候,我新开一个shell窗口(如代码注释所示),输入ls>>mandatory.txt
发现ls命令并没有等待我的getchar()输入,就能执行完毕。

问题: 这个和网上说的强制锁有点不一样啊,我期望的是另一个窗口中的ls命令能够等待我的程序运行完毕,再写入mandatory.txt,因为我已经remount了根文件系统。
我的理解错在哪里呢? 还请指教。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
2 [报告]
发表于 2015-02-28 12:00 |只看该作者
自己顶一下,求大侠的回复。

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
3 [报告]
发表于 2015-02-28 15:26 |只看该作者
你可以看一下强制锁的说明,其中有一条,是不可靠的 。。。 好像redhat一直都不行

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
4 [报告]
发表于 2015-02-28 18:15 |只看该作者
weishuo1999 发表于 2015-02-28 15:26
你可以看一下强制锁的说明,其中有一条,是不可靠的 。。。 好像redhat一直都不行


你是说,其他发行版的linux有的就可以? 这难道不是linux内核决定的吗,如果某个版本的内核以后都支持,那么无论是rh还是susue,只要是比较新的版本(2014以后的),是不是应该有一致的行为呢?

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
5 [报告]
发表于 2015-03-02 09:16 |只看该作者
有人回答一下吗

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
6 [报告]
发表于 2015-03-02 15:17 |只看该作者
你用fcntl 吧, flock 用的建议锁,大家都要按照约定使用锁,锁才有效果,否则不遵守约定的进程就**了锁。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
7 [报告]
发表于 2015-03-02 15:22 |只看该作者
crazyhadoop 发表于 2015-03-02 15:17
你用fcntl 吧, flock 用的建议锁,大家都要按照约定使用锁,锁才有效果,否则不遵守约定的进程就**了锁。


我调用函数就是fcntl啊,当然用了flock。难道我要用fcntl其他的调用参数?
请指点!

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
8 [报告]
发表于 2015-03-02 15:31 |只看该作者
强制性锁是内核检查的,如果要使用强制性锁,要使整个系统可以 使用强制性锁

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
9 [报告]
发表于 2015-03-02 15:36 |只看该作者
本帖最后由 cdsfiui 于 2015-03-02 15:37 编辑
crazyhadoop 发表于 2015-03-02 15:31
强制性锁是内核检查的,如果要使用强制性锁,要使整个系统可以 使用强制性锁


我在运行程序之前已经:

  1. # mount -o remount, mand /
复制代码
这样难道还不够吗?

论坛徽章:
0
10 [报告]
发表于 2015-04-23 20:33 |只看该作者
回复 1# cdsfiui

对一个特定文件打开其设置ID位、关闭其组执行位开启对该文件的强制性锁机制(引自UNIX环境高级编程)

/*turn on set-group-ID and turn off group-execute*/
(fstat(fd, &statbuf);
fchmod(fd, (statbuf.st_mode & ~S_IXGRP) | S_ISGID)


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP