flock()會依參數(shù)operation所指定的方式對參數(shù)fd所指的文件做各種鎖定或解除鎖定的動作科雳。此函數(shù)只能鎖定整個文件,無法鎖定文件的某一區(qū)域抖坪。
表頭文件 #include<sys/file.h>
定義函數(shù) int flock(int fd,int operation);
參數(shù) operation有下列四種情況:
LOCK_SH 建立共享鎖定忙灼。多個進程可同時對同一個文件作共享鎖定。
LOCK_EX 建立互斥鎖定洒试。一個文件同時只有一個互斥鎖定。
LOCK_UN 解除文件鎖定狀態(tài)朴上。
LOCK_NB 無法建立鎖定時,此操作可不被阻斷卒煞,馬上返回進程痪宰。通常與LOCK_SH或LOCK_EX 做OR(|)組合。
單一文件無法同時建立共享鎖定和互斥鎖定,而當(dāng)使用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
第二個進程被阻塞了,只有第一個進程結(jié)束或釋放扛点,第二個進程才會繼續(xù)哥遮。