搜尋
首頁系統教程LinuxLinux 系統程式設計的技巧:使用 fcntl() 實作讀寫鎖

Linux 系統程式設計的技巧:使用 fcntl() 實作讀寫鎖

Feb 13, 2024 pm 04:03 PM
linuxlinux教程linux系統linux指令shell腳本同步機制嵌入式linuxlinux入門linux學習

讀寫鎖是一種常用的同步機制,它可以讓多個行程或執行緒對同一個資源進行並發的讀取操作,或是互斥的寫入操作,從而提高系統的效率和安全性。在 Linux 系統程式設計中,有多種方法可以實作讀寫鎖,例如使用 pthread 函式庫、使用檔案鎖等。本文將為你介紹一種使用 fcntl() 系統呼叫實作讀寫鎖的方法,以及它的原理、用法和優缺點,讓你在 Linux 系統程式設計中更好地使用和理解這個技巧。

Linux 系统编程的一种技巧:使用 fcntl() 实现读写锁

#在多進程對同一個檔案進行讀寫存取時,為了確保資料的完整性,有事需要對檔案進行鎖定。可以透過fcntl()函數對檔案進行鎖定和解鎖。

\1. fcntl

1.1.功能描述:根據文件描述詞來操作文件的特性。

1.2.用法:

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock *lock);

fd:檔案描述詞。

cmd:操作指令。

arg:供指令使用的參數,是否需要arg參數跟cmd指令有關。

lock:鎖定資訊。

2.讀寫鎖定實例

新建兩個文件,原始碼如下2.1、2.2所示。

2.1.為檔案加讀鎖定

#include 

\#include 

\#include 

\#include 

\#include 

int main(int argc, const char * argv [ ])

{

int fd = open("test.c", O_RDONLY);

if (fd == -1)

{

perror("open failed:");

return -1;

}

struct stat sta;

fstat(fd,&sta);

struct flock lock;  

lock.l_len = sta.st_size;

lock.l_pid = getpid();

lock.l_start = 0;

lock.l_type = F_RDLCK;

lock.l_whence = SEEK_SET;

printf("进程pid: %d\n",lock.l_pid);

if(fcntl(fd,F_SETLK,&lock) == -1)

{

perror("fcntl fail ");

return -1;

}

else

{

printf("add read lock success!\n");

}

sleep(10);

close(fd);

return 0;

}

2.2.给文件加写锁

\#include 

\#include 

\#include 

\#include 

\#include 

int main(int argc, const char * argv [ ])

{

int fd = open("test.c", O_WRONLY);

if (fd == -1)

{

perror("open failed:");

return -1;

}

struct stat sta;

fstat(fd,&sta);

struct flock lock;  

lock.l_len = sta.st_size;

lock.l_pid = getpid();

lock.l_start = 0;

lock.l_type = F_WRLCK;

lock.l_whence = SEEK_SET;

printf("进程pid: %d\n",lock.l_pid);

while(fcntl(fd,F_SETLK,&lock) == -1 )

{

perror("fcntl:");

sleep(1);

struct flock lock_1;

lock_1 = lock;

lock_1.l_type = F_WRLCK;  //

fcntl(fd,F_GETLK,&lock_1);//获取文件锁状态,及加锁(lock_1.l_type)能否成功

switch(lock_1.l_type)

{

case F_RDLCK:

printf("检测到读锁 pid = %d \n",lock_1.l_pid);

break;

case F_WRLCK:

printf("检测到写锁 pid = %d \n",lock_1.l_pid);

break;

case F_UNLCK:

printf("检测到已解锁.pid = %d \n",lock_1.l_pid);

}

}

printf("写锁设置成功\n");

getchar();

close(fd);

return 0;

}


/*

注意:

1、fcntl(fd,F_GETLK,&lock_1)中的lock_1必須初始化,且lock_1.l_type必須設定為對應的鎖,才能確定能否加鎖成功,及不成功的原因。

2、GETLK時,fcntl先偵測有沒有能阻止本次加鎖的鎖,如果有,則覆寫flock結構體(lock_1)的資訊。如果沒有,則置lock_1.l_type 的類型為F_UNLCK。

*/

對於寫鎖(F_WRLCK 獨佔鎖),只有一個程序可以在檔案的任一特定區域上享有獨佔鎖。

對於讀鎖(F_RDLCK 共用鎖定),許多不同的程序可以同時擁有檔案上同一區域上的共用鎖定。為了擁有共享鎖,文件必須以讀取或讀取/寫入的方式開啟。只要任一進程擁有共享鎖,那麼其他進程就無法再獲得獨佔鎖。

分別編譯執行:

3.先執行讀鎖,再執行寫入鎖定。結果如下:

#
liu@ubuntu:~/learn/lrn_linux$ ./readlock.out 

进程pid: 16458

add read lock success!

liu@ubuntu:~/learn/lrn_linux$ ./writelock.out 

进程pid: 16459

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到已解锁.pid = 16459 

寫入鎖定設定成功

可以看出,當檔案被讀鎖定佔用時,無法新增寫入鎖定(獨佔鎖定)

4.先運行寫鎖,再運行讀鎖的話,結果如下:

liu@ubuntu:~/learn/lrn_linux$ ./writelock.out 

進程pid: 16349

寫入鎖定設定成功

liu@ubuntu:~/learn/lrn_linux$ ./readlock.out 

進程pid: 16350

fcntl fail : Resource temporarily unavailable

所以,加鎖是成功的。

透過本文,你應該對 Linux 系統程式設計中使用 fcntl() 實作讀寫鎖的方法有了一個基本的了解,知道了它的原理、用法和優缺點。你也應該明白了使用 fcntl() 實作讀寫鎖的目的和影響,以及如何在 Linux 系統程式設計中正確地使用和配置 fcntl()。我們建議你在需要實現讀寫鎖的場景中,使用 fcntl() 來實現你的目標。同時,我們也提醒你在使用 fcntl() 時要注意一些潛在的問題和挑戰,如相容性、可移植性、效能等。希望這篇文章能幫助你更好地使用 Linux 系統編程,讓你在 Linux 下掌握 fcntl() 的技巧和優勢。

以上是Linux 系統程式設計的技巧:使用 fcntl() 實作讀寫鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
互聯網在Linux上運行嗎?互聯網在Linux上運行嗎?Apr 14, 2025 am 12:03 AM

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作是什麼?Linux操作是什麼?Apr 13, 2025 am 12:20 AM

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

使用Linux別名提高自定義命令快捷方式的生產率使用Linux別名提高自定義命令快捷方式的生產率Apr 12, 2025 am 11:43 AM

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux實際上有什麼好處?Linux實際上有什麼好處?Apr 12, 2025 am 12:20 AM

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

如何學習Linux基礎知識?如何學習Linux基礎知識?Apr 10, 2025 am 09:32 AM

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux最有用的是什麼?Linux最有用的是什麼?Apr 09, 2025 am 12:02 AM

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

Linux的缺點是什麼?Linux的缺點是什麼?Apr 08, 2025 am 12:01 AM

Linux的缺點包括用戶體驗、軟件兼容性、硬件支持和學習曲線。 1.用戶體驗不如Windows或macOS友好,依賴命令行界面。 2.軟件兼容性不如其他系統,缺乏許多商業軟件的原生版本。 3.硬件支持不如Windows全面,可能需要手動編譯驅動程序。 4.學習曲線較陡峭,掌握命令行操作需要時間和耐心。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具