日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文件锁操作《精通Unix下C语言编程与项目实践》之三

發(fā)布時間:2024/1/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件锁操作《精通Unix下C语言编程与项目实践》之三 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章試讀 不拘一個遍程序系列程序不能一個腦袋鉆到底,有時要學會變通,即所謂的曲線救國。、 職場規(guī)劃:一些雜七雜八的職場感悟吧。不值錢的軟件人才 精力充沛與事業(yè)成功 我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌?? 香格里拉美人圖 寶寶圖片:超可愛的小寶寶 博客 考試培訓:主要是關于考研、軟考和等級的相關題解。2009考研試題分析?2008年12月程序員試題分析 ? ? ?

精通Unix下C語言編程與項目實踐之三 文件鎖操作? 作者:朱云翔,胡平 6.9.3 文件鎖操作 在鎖機制的使用中,最常見的操作有鎖的請求、釋放和測試等,這些操作代碼基本類似,本處將一一說明。

1. 測試鎖<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

設計函數SeeLock,它查詢文件描述符fd對應文件的鎖信息,其原型為:

void SeeLock(int fd, int start, int len);

本函數查詢描述符fd對應文件從偏移start處開始的len字節(jié)中的鎖信息,如代碼6-5所示:

代碼6-5 測試鎖源碼(節(jié)自/code/chapter6/lock1.c

void SeeLock(int fd, int start, int len)

{

??? struct flock arg;

??? arg.l_type=F_WRLCK;

??? arg.l_whence = SEEK_SET;

??? arg.l_start = start;

??? arg.l_len = len;

??? if (fcntl(fd, F_GETLK, &arg) == -1) fprintf(stderr, "See Lock failed.\n");

??? else if (arg.l_type == F_UNLCK) fprintf(stderr, "No Lock From %d To %d\n", start, len);

??? else if (arg.l_type == F_WRLCK) fprintf(stderr, "Write Lock From %d To %d, id=%d\n", start, len, arg.l_pid);

??? else if (arg.l_type == F_RDLCK) fprintf(stderr, "Read Lock From %d To %d, id=%d\n", start, len, arg.l_pid);

}

2. 申請讀鎖

設計共享讀鎖申請函數GetReadLock,其原型為:

void GetReadLock(int fd, int start, int len);

本函數以阻塞模式在文件描述符fd對應的文件中申請共享讀鎖,鎖定的區(qū)域為從偏移start處開始的len字節(jié),如代碼6-6所示:

代碼6-6 阻塞申請共享讀鎖源碼(節(jié)自/code/chapter6/lock1.c

void GetReadLock(int fd, int start, int len)

{

??? struct flock arg;

??? arg.l_type=F_RDLCK;

??? arg.l_whence = SEEK_SET;

??? arg.l_start = start;

??? arg.l_len = len;

??? if (fcntl(fd, F_SETLKW, &arg) == -1) fprintf(stderr, "[%d] Set Read Lock failed.\n", getpid());

??? else fprintf(stderr, "[%d] Set Read Lock From %d To %d\n", getpid(), start, len);

}

3. 申請寫鎖

設計互斥寫鎖申請函數GetWriteLock,其原型為:

void GetWriteLock(int fd, int start, int len)

本函數以阻塞模式在文件描述符fd對應的文件中申請互斥寫鎖,鎖定的區(qū)域為從偏移start處開始的len字節(jié),如代碼6-7所示:

代碼6-7 阻塞申請互斥寫鎖源碼(節(jié)自/code/chapter6/lock1.c

void GetWriteLock(int fd, int start, int len)

{

??? struct flock arg;

??? arg.l_type=F_WRLCK;

??? arg.l_whence = SEEK_SET;

??? arg.l_start = start;

??? arg.l_len = len;

??? if (fcntl(fd, F_SETLKW, &arg) == -1) fprintf(stderr, "[%d] Set Write Lock failed.\n", getpid());

??? else fprintf(stderr, "[%d] Set Write Lock From %d To %d\n", getpid(), start, len);

}

4. 釋放鎖

設計文件鎖釋放函數ReleaseLock,其原型為:

void ReleaseLock(int fd, int start, int len);

本函數從文件描述符fd對應的文件中的釋放鎖,釋放的區(qū)域為從偏移start處開始的len字節(jié),如代碼6-8所示:

代碼6-8 釋放鎖源碼(節(jié)自/code/chapter6/lock1.c

void ReleaseLock(int fd, int start, int len)

{

??? struct flock arg;

??? arg.l_type=F_UNLCK;

??? arg.l_whence = SEEK_SET;

??? arg.l_start = start;

??? arg.l_len = len;

??? if (fcntl(fd, F_SETLKW, &arg) == -1) fprintf(stderr, "[%d] UnLock failed.\n", getpid());

??? else fprintf(stderr, "[%d] UnLock From %d To %d\n", getpid(), start, len);

}

實例

本處設計了一個文件鎖控制進程的實例,如代碼6-9所示:

代碼6-9 釋放鎖源碼(節(jié)自/code/chapter6/lock1.c

#include <stdio.h>

#include <fcntl.h>

void main()

{

??? int fd;

??? struct flock arg;

??? if ((fd = open("/tmp/tlock1", O_RDWR| O_CREAT, 0755)) <0)

??? {

??????? fprintf(stderr, "open file failed.\n");

??????? return;

??? }

??? SeeLock(fd, 0, 10);????

??? GetReadLock(fd, 0, 10);???? /* 申請讀鎖 */

??? SeeLock(fd, 11, 20);???????

??? GetWriteLock(fd, 11, 20);?? /* 申請寫鎖 */

??? sleep(30);?????

??? ReleaseLock(fd, 0, 10);???? /* 釋放鎖 */

??? ReleaseLock(fd, 11, 20);??? /* 釋放鎖 */

}

編譯代碼6-9如下:

# make lock1

??????? cc -O -o lock1 lock1.c

后臺執(zhí)行進程lock1。它在文件010字節(jié)處設置讀鎖在文件1120字節(jié)處設置寫鎖然后進入休眠。

# ./lock1 &

No Lock From 0 To 10??????????????????? (進程19062,檢查文件0~10處,發(fā)現無鎖)

[19062] Set Read Lock From 0 To 10????? (進程19062,在文件0~10處,設置讀鎖)

No Lock From 11 To 20?????????????????? (進程19062,檢查文件11~20處,發(fā)現無鎖)

[19062] Set Write Lock From 11 To 20??? (進程19062,在文件11~20處,設置寫鎖)

19062

再執(zhí)行進程lock1,此時第二個進程lock1將查詢到文件第010字節(jié)處具有讀鎖,文件第11~20字節(jié)處具有寫鎖。由于讀鎖的共享性和寫鎖的互斥性,進程能夠申請到讀鎖,但不能申請到寫鎖,進程阻塞。

# ./lock1

Read Lock From 0 To 10, id=19062??????? 進程19063檢查文件0~10發(fā)現讀鎖

[19063] Set Read Lock From 0 To 10????? 進程19063在文件0~10設置讀鎖

Write Lock From 11 To 20, id=19062????? 進程19063檢查文件11~20發(fā)現寫鎖

直到第一個lock1進程執(zhí)行完畢,釋放所占用的讀、寫鎖,第二個lock1進程方可獲取寫鎖,然后進入休眠階段。

[19062] UnLock From 0 To 10???????????? 進程19062釋放文件0~10處的讀鎖

[19062] UnLock From 11 To 20??????????? 進程19062釋放文件0~10處的讀鎖

[19063] Set Write Lock From 11 To 20??? 進程19063在文件11~20設置寫鎖

休眠結束,程序退出。

[19063] UnLock From 0 To 10???????????? 進程19062釋放文件0~10處的讀鎖

[19063] UnLock From 11 To 20??????????? 進程19062釋放文件0~10處的讀鎖

?

相關文章: 封面??????????前言????????目錄?????????策劃???????? 作者 動態(tài)庫????????變長參數??? 文件鎖

轉載于:https://blog.51cto.com/zhuyunxiang/132548

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的文件锁操作《精通Unix下C语言编程与项目实践》之三的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。