溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux C 文件鎖的操作

發(fā)布時間:2020-06-17 07:37:12 來源:網(wǎng)絡(luò) 閱讀:1395 作者:SherryX 欄目:系統(tǒng)運維

文件鎖的類型

<br>

1 讀鎖

共享鎖,如果A進(jìn)程對文件的某區(qū)域加了讀鎖,B進(jìn)程也可以在此區(qū)域加讀鎖,但是不能對此區(qū)域加寫鎖。

2 寫鎖

獨占鎖,如果A進(jìn)程對文件的某個區(qū)域加了寫鎖,B進(jìn)程就不能對此區(qū)域加寫鎖,也不能對此區(qū)域加讀鎖。
<br>
當(dāng)多個進(jìn)程同時對一個文件進(jìn)行讀寫操作時,為確保文件的完整和一致性,這幾個進(jìn)程要加鎖同步。
<br>
當(dāng)進(jìn)程開始讀取文件的某個區(qū)域時,先加讀鎖,讀完之后再解鎖。
<br>

3 文件記錄鎖

文件記錄鎖
1.函數(shù)原型:int fcntl (int fd,int cmd,struct flck lock);
參數(shù):fd:文件描述符;
???cmd:功能符號;(F_SETLK用來設(shè)置或釋放鎖; F_GETLK用來獲得鎖信息;)
???lock:存儲鎖信息的結(jié)構(gòu)體指針;
???返回值:調(diào)用成功返回0,失敗返回-1
2.鎖信息結(jié)構(gòu)體
struct flock
{
short l_type; /
鎖的類型 /
short l_whence; /
偏移量的起始位置: /
off_t l_start; /
從l_whence的偏移量 /
off_t l_len; /
從l_start開始的字節(jié)數(shù) /
pid_t l_pid; /
鎖所屬進(jìn)程ID(一般不用) */
}
<br>
l_type有F_RDLCK讀鎖、F_WRLCK寫鎖及F_UNLCK空鎖。
(!!注意:讀鎖,不會影響數(shù)據(jù),可以一直加;但是寫鎖,只能加一次)

l_whence有SEEK_SET、SEEK_CUR和SEEK_END。

l_len為0時表示從起點開始直至最大可能位置為止。
<br>
下面舉個加寫鎖的例子:

#include < stdio.h>
#include < unistd.h>
#include < fcntl.h>
/**
 int fctnl(int fd,int cmd,struct *lock);        //cmd:F_SETLK設(shè)置或解放鎖;F_GETLK獲得鎖信息;返回值:0-成功,-1-失敗
 struct flock{
    short l_type;           // of lock:F_RDLCK,F_WRLCK,F_UNLCK
    short l_whence;     //How to interpreter l_start:SEEK_SET,SEEK_CUR,SEEK_END
    off_t l_start;          //Starting offset for lock
    off_t l_len;                //Number of bytes to lock
    pid_t l_pid;                //PID of process blocking our lock(F_GETLK only)
};
*/

int main()
{
    int fd;
    int res;
    struct flock lock = {0};

    if((fd = open("a.txt",O_RDWR)) == -1)
    {
        fd = open("a.txt", O_CREAT);
    }
    if(fd == -1)
    {
        printf("file open failed!\n");
        return 1;
    }

//  printf("fd=%d\n",fd);

    //判斷是否有鎖
    res = fcntl(fd,F_GETLK,&lock);
    if(res == -1)
    {
        perror("判斷有鎖失敗");
        return 1;
    }
    if(lock.l_type != F_UNLCK)
    {
        printf("fail:the file has locked!\n");
    }
    else    //上寫鎖,讀鎖可以一直加,寫鎖只能加一個
    {
        memset(&lock,0,sizeof(struct flock));
        lock.l_whence = SEEK_SET;
        lock.l_start = 0;
        lock.l_len = 10;
        lock.l_type = F_WRLCK;

        res = fcntl(fd,F_SETLK,&lock);
        if(res == -1)
        {
            perror("上鎖失敗");
            return 1;
        }
        //操作文件
        getchar();
        //解鎖
        lock.l_type = F_UNLCK;
        res = fcntl(fd,F_SETLK,&lock);
        if(res == -1)
        {
            perror("解鎖失敗");
            return 1;
        }
    }

    close(fd);
    return 0;
}

<br>
關(guān)于多個進(jìn)程上鎖的問題,本質(zhì)上步驟一樣,后面復(fù)習(xí)中陸續(xù)再更...

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI