我正在试验flock
个:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(){
mode_t m = umask(0);
int fd = open("/tmp/test.lock", O_RDWR | O_CREAT, 0666);
if(fd == -1){
printf("open failed. errno: %d, %s\n", errno, strerror(errno));
}
umask(m);
int res = flock(fd, LOCK_EX);
if(res != 0){
printf("flock failed. errno: %d, %s\n", errno, strerror(errno));
}
}
如果我用sudo
运行可执行文件,那么正常情况下,不会出现错误.但是,如果我以普通用户身份运行,我会得到sudo
进程的结果:open failed. errno: 13, Permission denied
:
r@rvb-my:~/work$ gcc test.cpp
r@rvb-my:~/work$ ./a.out
r@rvb-my:~/work$ ls -l /tmp/test.lock
-rw-rw-rw- 1 r r 0 Jan 23 15:09 /tmp/test.lock
r@rvb-my:~/work$ sudo ./a.out
open failed. errno: 13, Permission denied
flock failed. errno: 9, Bad file descriptor
r@rvb-my:~/work$ rm /tmp/test.lock
r@rvb-my:~/work$ sudo ./a.out
r@rvb-my:~/work$ ls -l /tmp/test.lock
-rw-rw-rw- 1 root root 0 Jan 23 15:09 /tmp/test.lock
r@rvb-my:~/work$ ./a.out
r@rvb-my:~/work$ ls -l /tmp/test.lock
-rw-rw-rw- 1 root root 0 Jan 23 15:09 /tmp/test.lock
为什么会发生这种情况,以及如何创建锁定文件以使两个进程在这两种情况下都可以访问?