cdsfiui 发表于 2015-02-27 09:25

强制锁没有起作用,为什么?

网上的说法是,强制锁被建立的时候,其他进程要访问一个文件必须等待强制锁释放。于是我弄了一个实验:

我在我的rhel里面,用mount命令加上了mand选项:
# mount -o remount, mand /
然后我写了个一个小程序,从网上的例子改过来的:
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<dirent.h>
#include<sys/file.h>
#include<unistd.h>
int main()
{
int fd=open("mandatory.txt",O_RDWR);
struct flock lk;
lk.l_type=F_WRLCK;
lk.l_start=0;
lk.l_whence=SEEK_SET;
lk.l_len=0;
lk.l_pid=getpid();
int flag=fcntl(fd,F_SETLKW,&lk);
printf("%d\n",flag);
getchar();//运行到这里的时候,我新开一个shell窗口
close(fd);
return 0;
}
然后测试,我建立了一个文件:
touch mandatory.txt
chmod g+s,g-x mandatory.txt
运行我的程序,运行到getchar()的时候,我新开一个shell窗口(如代码注释所示),输入ls>>mandatory.txt
发现ls命令并没有等待我的getchar()输入,就能执行完毕。

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

cdsfiui 发表于 2015-02-28 12:00

自己顶一下,求大侠的回复。

weishuo1999 发表于 2015-02-28 15:26

你可以看一下强制锁的说明,其中有一条,是不可靠的 。。。 好像redhat一直都不行

cdsfiui 发表于 2015-02-28 18:15

weishuo1999 发表于 2015-02-28 15:26 static/image/common/back.gif
你可以看一下强制锁的说明,其中有一条,是不可靠的 。。。 好像redhat一直都不行

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

cdsfiui 发表于 2015-03-02 09:16

有人回答一下吗

crazyhadoop 发表于 2015-03-02 15:17

你用fcntl 吧, flock 用的建议锁,大家都要按照约定使用锁,锁才有效果,否则不遵守约定的进程就**了锁。

cdsfiui 发表于 2015-03-02 15:22

crazyhadoop 发表于 2015-03-02 15:17 static/image/common/back.gif
你用fcntl 吧, flock 用的建议锁,大家都要按照约定使用锁,锁才有效果,否则不遵守约定的进程就**了锁。

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

crazyhadoop 发表于 2015-03-02 15:31

强制性锁是内核检查的,如果要使用强制性锁,要使整个系统可以 使用强制性锁

cdsfiui 发表于 2015-03-02 15:36

本帖最后由 cdsfiui 于 2015-03-02 15:37 编辑

crazyhadoop 发表于 2015-03-02 15:31 static/image/common/back.gif
强制性锁是内核检查的,如果要使用强制性锁,要使整个系统可以 使用强制性锁

我在运行程序之前已经:
# mount -o remount, mand /
这样难道还不够吗?

darling54454 发表于 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)


   
页: [1] 2
查看完整版本: 强制锁没有起作用,为什么?