文件锁操作《精通Unix下C语言编程与项目实践》之三
生活随笔
收集整理的這篇文章主要介紹了
文件锁操作《精通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。它在文件0~10字節(jié)處設置讀鎖,在文件11~20字節(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將查詢到文件第0~10字節(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语言编程与项目实践》之三的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美工一流的个人网站源码系列(2),不漂亮
- 下一篇: 升级为Exchange 2007后怀念的