flock

作者: 氕氘氚0921 | 来源:发表于2018-03-30 15:54 被阅读13次

    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

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

    相关文章

      网友评论

        本文标题:flock

        本文链接:https://www.haomeiwen.com/subject/tkcicftx.html