我爱编程

flock

2018-03-30  本文已影响13人  氕氘氚0921

flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
表头文件 #include<sys/file.h>
定义函数 int flock(int fd,int operation);
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。

举例:
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <sys/file.h>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString locker = "test.lock";
QFile *fLocker = new QFile(locker);
qDebug() << "1";
if(!fLocker->open(QFile::ReadWrite))
{
    qDebug() << "2";
    return 1;
}
qDebug() << "3";
int lockfd = fLocker->handle();
qDebug() << "4";
if( -1 == flock(lockfd, LOCK_EX) )
{
    qDebug() << "5";
    return 1;
}
qDebug() << "6";

return a.exec();
}

启动两次程序,第一个显示:


1.png

后一个显示:


2.png

第二个进程被阻塞了,只有第一个进程结束或释放,第二个进程才会继续。

上一篇下一篇

猜你喜欢

热点阅读