F_SETLKW F_SETLK 作用相同,但是无法建立锁定时,此调用会一直 等到锁定动作成功为止。若在等待锁定的过程中被信号中断时,会 立即返回-1,错误代码为EINTR。参数lock指针为flock 结构指针,定义如下 struct flock { short int l_type; /* 锁定的状态*/ short int l_whence;/*决定l_start位置*/ off_t l_...
(3) 进程不能使用F_GETLK命令来测试它自己是否再文件的某一部分持有一把锁。F_GETLK命令定义说明,返回信息指示是否现存的锁阻止调用进程设置它自己的锁。因为,F_SETLK和F_SETLKW命令总是替换进程的现有锁,所以调用进程绝不会阻塞再自己持有的锁上,于是F_GETLK命令绝不会报告调用进程自己持有的锁。 (4) 进程终止...
F_SETLK:申请锁(读锁F_RDLCK,写锁F_WRLCK)或者释放所(F_UNLCK),但是如果kernel无法将锁授予本进程(被其他进程抢了先,占了锁),不傻等,返回error。 F_SETLKW:和F_SETLK几乎一样,唯一的区别,这厮是个死心眼的主儿,申请不到,就傻等。 F_GETLK:这个接口是获取锁的相关信息: 这个接口会修改我们传入的struct ...
下面首先给出了使用fcntl 函数的文件记录锁函数。在该函数中,首先给flock 结构体的对应位赋予相应的值。接着使用两次fcntl函数分别用于给相关文件上锁和判断文件是否可以上锁,这里用到的cmd值分别为F_SETLK 和F_GETLK。 这个函数的源代码如下所示: /*lock_set函数*/ ...
F_SETLK:加锁(F_RDLCK/F_WRLCK)或解锁(F_UNLCK);若该操作与其他进程对该文件区域的锁相冲突,则返回-1,并将errno设置为EACCES或EAGAIN。 F_SETLKW:与F_SETLK相同,但与其他进程对该文件区域的锁相冲突时将阻塞,等待解锁;等待过程中若被信号中断,则返回-1,并将errno设置为EINTR。
F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会即时返回并将errno置为EINTR。 F_GETLK:获取文件锁信息。 F_UNLCK:释放文件锁。 为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。
1)POSIXFLOCK这个比较明确,就是哪个类型的锁。flock系统调用产生的是FLOCK,fcntl调用F_SETLK,F_SETLKW或者lockf产生的是POSIX类型,有次可见两种调用产生的锁的类型是不同的; 2)ADVISORY表明是劝告锁; 3)WRITE顾名思义,是写锁,还有读锁; 4)18849是持有锁的进程ID。当然对于flock这种类型的锁,会出现进程已经退出的...
用F_SETLK命令设置flock结构所描述的锁操作。 int lock_set(int fd, int type){ struct flock old_lock, lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; lock.l_pid = -1; /* 判断文件是否可以上锁 */ fcntl(___); if (___){ /* 判断文...
F_GETFL:获取文件打开方式的标志;当执行F_SETLK时fcntl函数返回一个错误时,导致该错误的某个锁的信息可能由F_GETLK命令返回,从而允许我们确定哪个进程锁着了请求的文件区,及上锁的方式,但是也可返回该文件区已经解锁的信息,因为在F_SETLK和F_GETLK之间该文件可能解锁。