linux文件I/O:文件鎖的概念、函數以及代碼實現

文件鎖是一種用來保證多個進程對同一個文件的安全訪問的機制。文件鎖可以分為兩種類型:建議性鎖和強制性鎖。建議性鎖是一種協作式的鎖,它只有在所有參與的進程都遵守鎖的規則時才有效。強制性鎖是一種強制式的鎖,它由內核或文件系統來強制執行,不需要進程的配合。本文將主要介紹建議性鎖的實現方法和相關函數。

1. flock函數

flock函數是一種使用文件描述符來實現文件鎖的方法。flock函數的功能是對一個已打開的文件描述符fd進行鎖定或解鎖操作,它的函數原型如下:

#include <sys/file.h>
int flock(int fd, int operation);

flock函數的用法如下:

  • 打開一個文件,獲得一個文件描述符fd。
  • 調用flock函數,傳入fd和想要的鎖類型,例如LOCK_EX。
  • 如果成功,返回0,表示獲得了鎖,可以對文件進行讀寫操作。
  • 如果失敗,返回-1,并設置errno,表示沒有獲得鎖,可能是因為文件已經被其他進程鎖定,或者其他錯誤發生。
  • 在完成文件操作后,調用flock函數,傳入fd和LOCK_UN,釋放鎖,關閉文件。

flock函數的參數如下:

  • fd:一個已打開的文件描述符,必須是可讀或可寫的,不能是只執行的。
  • operation:一個表示鎖類型的整數,可以是LOCK_SH、LOCK_EX、LOCK_UN或LOCK_NB的組合。
  • LOCK_SH:共享鎖,允許多個進程同時對文件進行讀操作,但不允許寫操作。
  • LOCK_EX:獨占鎖,只允許一個進程對文件進行讀寫操作,其他進程都不能訪問文件。
  • LOCK_UN:解鎖,釋放之前的鎖定,允許其他進程訪問文件。
  • LOCK_NB:非阻塞,如果不能立即獲得鎖,不會等待,而是返回錯誤。

flock函數的注意事項如下:

  • flock函數只能對整個文件進行鎖定,不能對文件的部分區域進行鎖定。
  • flock函數的鎖是與進程相關的,而不是與文件描述符相關的。也就是說,如果一個進程對一個文件加了鎖,那么該進程的其他文件描述符也可以訪問該文件,而不受鎖的影響。同樣,如果一個進程關閉了一個文件描述符,那么該進程的其他文件描述符仍然保持鎖定狀態,直到該進程退出或顯式解鎖。
  • flock函數的鎖是建議性的,也就是說,它只有在所有參與的進程都遵守鎖的規則時才有效。如果有一個進程不使用flock函數,而是直接對文件進行讀寫操作,那么flock函數的鎖就會失效,造成數據的不一致或損壞。

flock函數的代碼示例如下:

// 一個使用flock函數的簡單示例,對一個文件加上獨占鎖,寫入一些數據,然后解鎖
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <string.h>int main() {// 打開一個文件,獲得一個文件描述符int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("open");exit(1);}// 調用flock函數,傳入fd和LOCK_EX,加上獨占鎖if (flock(fd, LOCK_EX) == -1) {perror("flock");exit(1);}printf("Locked file\n");// 對文件進行寫操作,寫入一些數據char *data = "Hello, world!\n";if (write(fd, data, strlen(data)) == -1) {perror("write");exit(1);}printf("Wrote data to file\n");// 調用flock函數,傳入fd和LOCK_UN,解鎖文件if (flock(fd, LOCK_UN) == -1) {perror("flock");exit(1);}printf("Unlocked file\n");// 關閉文件close(fd);return 0;
}

2. fcntl函數

fcntl函數是一種使用文件描述符來實現文件鎖的方法。fcntl函數的功能是對一個已打開的文件描述符fd進行各種控制操作。它的函數原型如下:

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

fcntl函數的用法如下:

  • 打開一個文件,獲得一個文件描述符fd。
  • 調用fcntl函數,傳入fd和F_GETLK,以及一個指向struct flock結構體的指針,獲取文件鎖的信息。
  • 如果文件沒有被其他進程鎖定,或者鎖的類型和想要的類型不沖突,可以繼續調用fcntl函數,傳入fd和F_SETLK或F_SETLKW,以及一個指向struct flock結構體的指針,設置文件鎖的信息。
  • 如果成功,返回0,表示獲得了鎖,可以對文件進行讀寫操作。
  • 如果失敗,返回-1,并設置errno,表示沒有獲得鎖,可能是因為文件已經被其他進程鎖定,或者其他錯誤發生。
  • 在完成文件操作后,調用fcntl函數,傳入fd和F_SETLK或F_SETLKW,以及一個指向struct flock結構體的指針,設置文件鎖的類型為F_UNLCK,釋放鎖,關閉文件。

fcntl函數的參數如下:

  • fd:一個已打開的文件描述符,必須是可讀或可寫的,不能是只執行的。
  • cmd:一個表示控制操作的整數,可以是F_DUPFD、F_GETFD、F_SETFD、F_GETFL、F_SETFL、F_GETLK、F_SETLK或F_SETLKW之一。
  • F_DUPFD:復制文件描述符,返回一個新的文件描述符,指向同一個文件。
  • F_GETFD:獲取文件描述符的標志,返回一個整數,表示是否設置了FD_CLOEXEC標志,該標志表示在執行exec函數時,自動關閉文件描述符。
  • F_SETFD:設置文件描述符的標志,傳入一個整數,表示是否設置FD_CLOEXEC標志。
  • F_GETFL:獲取文件狀態標志,返回一個整數,表示文件的訪問模式和其他標志,例如O_RDONLY、O_WRONLY、O_APPEND等。
  • F_SETFL:設置文件狀態標志,傳入一個整數,表示文件的訪問模式和其他標志,例如O_RDONLY、O_WRONLY、O_APPEND等。
  • F_GETLK:獲取文件鎖的信息,傳入一個指向struct flock結構體的指針,返回該結構體的內容,表示文件是否被其他進程鎖定,以及鎖的類型、起始位置、長度和持有者等信息。
  • F_SETLK:設置文件鎖,傳入一個指向struct flock結構體的指針,表示要設置的鎖的類型、起始位置、長度等信息,如果成功,返回0,表示獲得了鎖,如果失敗,返回-1,并設置errno,表示沒有獲得鎖,可能是因為文件已經被其他進程鎖定,或者其他錯誤發生。
  • F_SETLKW:設置文件鎖,與F_SETLK類似,但是如果不能立即獲得鎖,會阻塞等待,直到獲得鎖或者被信號中斷。
  • arg:一個可選的參數,根據cmd的不同,可以是一個整數、一個指針或者省略。如果是一個整數,表示要設置的標志或文件描述符。如果是一個指針,表示要傳入或返回的struct flock結構體的地址。如果省略,表示不需要傳入任何參數。

fcntl函數的注意事項如下:

  • fcntl函數可以對文件的部分區域進行鎖定,而不是整個文件。這可以通過設置struct flock結構體的l_whence、l_start和l_len字段來實現。l_whence表示鎖的起始位置的參考點,可以是SEEK_SET(文件開頭)、SEEK_CUR(當前位置)或SEEK_END(文件結尾)。l_start表示鎖的起始位置的偏移量,可以是正數、負數或零。l_len表示鎖的長度,如果是正數,表示從起始位置向后鎖定的字節數,如果是負數,表示從起始位置向前鎖定的字節數,如果是零,表示從起始位置到文件結尾的所有字節。
  • fcntl函數的鎖是與文件描述符相關的,而不是與進程相關的。也就是說,如果一個進程對一個文件加了鎖,那么該進程的其他文件描述符不能訪問該文件,而受鎖的影響。同樣,如果一個進程復制了一個文件描述符,那么復制的文件描述符也會繼承鎖的狀態,直到所有的文件描述符都關閉或顯式解鎖。
  • fcntl函數的鎖是建議性的,也就是說,它只有在所有參與的進程都遵守鎖的規則時才有效。如果有一個進程不使用fcntl函數,而是直接對文件進行讀寫操作,那么fcntl函數的鎖就會失效,造成數據的不一致或損壞。

fcntl函數的代碼示例如下:

// 一個使用fcntl函數的簡單示例,對一個文件的前10個字節加上共享鎖,讀取數據,然后解鎖
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>int main() {// 打開一個文件,獲得一個文件描述符int fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("open");exit(1);}// 定義一個struct flock結構體,表示要設置的鎖的信息struct flock lock;lock.l_type = F_RDLCK; // 共享鎖lock.l_whence = SEEK_SET; // 文件開頭lock.l_start = 0; // 起始位置lock.l_len = 10; // 長度// 調用fcntl函數,傳入fd和F_SETLK,以及lock的地址,設置文件鎖if (fcntl(fd, F_SETLK, &lock) == -1) {perror("fcntl");exit(1);}printf("Locked file\n");// 對文件進行讀操作,讀取前10個字節的數據char buf[11]; // 定義一個緩沖區,多留一個字節存放'\0'if (read(fd, buf, 10) == -1) {perror("read");exit(1);}buf[10] = '\0'; // 添加字符串結束符printf("Read data from file: %s\n", buf); // 打印讀取的數據// 調用fcntl函數,傳入fd和F_SETLK,以及lock的地址,設置文件鎖的類型為F_UNLCK,解鎖文件lock.l_type = F_UNLCK; // 解鎖if (fcntl(fd, F_SETLK, &lock) == -1) {perror("fcntl");exit(1);}printf("Unlocked file\n");// 關閉文件close(fd);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Pytorch從零開始構建RNN

在這篇文章中&#xff0c;我們將了解 RNN&#xff08;即循環神經網絡&#xff09;&#xff0c;并嘗試通過 PyTorch 從頭開始??實現其中的部分內容。是的&#xff0c;這并不完全是從頭開始&#xff0c;因為我們仍然依賴 PyTorch autograd 來計算梯度并實現反向傳播&#xff0c…

Apache訪問控制

服務器相關的訪問控制 Options指令 Options指令是Apache服務器配置文件中的一個重要指令,它可以用于控制特定目錄啟用哪些服務器特性。Options指令可以在Apache服務器的核心配置、虛擬主機配置、特定目錄配置以及.htaccess文件中使用。 以下是一些常用的服務器特性選項: N…

Django(九、cookie與session)

文章目錄 一、cookie與session的介紹HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登錄功能 一、cookie與session的介紹 在講之前我們先來回憶一下HTTP的四大特性 HTTP四大特性 1.基于請求響應 2.基于TIC、IP作用于應用層上的協議 3.無狀態 保存…

二叉查找(排序)樹你需要了解一下

簡介 二叉排序樹&#xff08;Binary Sort Tree&#xff09;&#xff0c;又稱二叉查找樹&#xff08;Binary Search Tree&#xff09;&#xff0c;亦稱二叉搜索樹&#xff0c;是一種重要的數據結構。 它有以下特性&#xff1a; 若左子樹不空&#xff0c;則左子樹上所有結點的…

目標檢測YOLO系列從入門到精通技術詳解100篇-【圖像處理】目標檢測

目錄 幾個高頻面試題目 如何在超大分辨率的圖片中檢測目標? 1當超大分辨率圖像邂逅目標檢測任務 2You Only Look Twice

邊緣計算多角色智能計量插座 x 資產顯示標簽:實現資產追蹤與能耗管理的無縫結合

越來越多智慧園區、智慧工廠、智慧醫院、智慧商業、智慧倉儲物流等企業商家對精細化、多元化智能生態應用場景的提升&#xff0c;順應國家節能減排、環保的時代潮流&#xff0c;設計一款基于融合以太網/WiFi/藍牙智能控制的智能多角色插座應運而生&#xff0c;賦予智能插座以遙…

大數據學習(23)-hive on mapreduce對比hive on spark

&&大數據學習&& &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 承認自己的無知&#xff0c;乃是開啟智慧的大門 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主哦&#x1f91…

uniapp實現表單彈窗

uni.showModal({title: 刪除賬戶,confirmColor:#3A3A3A,cancelColor:#999999,confirmText:確定,editable:true,//顯示content:請輸入“delete”刪除賬戶,success: function (res) {console.log(res)if(res.confirm){if(res.contentdelete){console.log(123123123213)uni.setSto…

PCIE鏈路訓練-狀態跳轉1

A&#xff1a;12ms超時&#xff0c;或者再任何lane上檢測到Electrical Idle Exit&#xff1b; B&#xff1a; 1.發送“receiver detection”之后沒有一個lane的接收邏輯被rx檢測到 2.不滿足條件c&#xff0c;比如兩次detection出現差別&#xff1b; C&#xff1a;發送端在沒…

凸優化基礎與應用

諸神緘默不語-個人CSDN博文目錄 文章目錄 1. 線性規劃用SciPy求解 2. 二次規劃3. 半定規劃4. 錐規劃 凸優化是數學優化的一個重要分支&#xff0c;廣泛應用于各種工程和科學領域。它的核心特征在于優化問題的目標函數和約束條件是凸的&#xff0c;這使得找到全局最優解變得可行…

Ps:背景橡皮擦工具摳圖實例

背景橡皮擦工具 Background Eraser Tool由于是一個破壞性的工具&#xff08;直接刪除像素&#xff09;而少被人使用。 其實&#xff0c;它不僅是一個功能強大的摳圖工具&#xff0c;也是可以轉換為非破壞性運用的。 原圖&#xff08;注&#xff1a;圖片來自網絡&#xff09; 效…

微軟離Altman越近,離OpenAI就越遠!

大數據產業創新服務媒體 ——聚焦數據 改變商業 在OpenAI這場連續劇中&#xff08;之所以說是連續劇&#xff0c;這個事情肯定沒完&#xff0c;后面肯定還會出續集&#xff09;&#xff0c;讓我倍感意外的是&#xff0c;Altman剛跟OpenAI分手&#xff0c;“離婚手續”都還沒辦…

使用Pytorch從零開始構建WGAN

引言 在考慮生成對抗網絡的文獻時&#xff0c;Wasserstein GAN 因其與傳統 GAN 相比的訓練穩定性而成為關鍵概念之一。在本文中&#xff0c;我將介紹基于梯度懲罰的 WGAN 的概念。文章的結構安排如下&#xff1a; WGAN 背后的直覺&#xff1b;GAN 和 WGAN 的比較&#xff1b;…

selenium新版使用find_element/find_elements函數鎖定元素(替換原有find_element_by_xx)

css選擇器請參考&#xff1a;網絡爬蟲之css選擇器 原來的find_element_by_xx都被修改為find_element&#xff08;返回匹配到的第一個元素&#xff09;或find_elements&#xff08;返回全部的匹配元素&#xff09; from selenium.webdriver.common.by import By示例程序 選擇…

【Q3——30min】

1、介紹一下數據庫的三大范式 第一范式(1NF)&#xff1a;屬性不可分割&#xff0c;即每個屬性都是不可分割的原子項。(實體的屬性即表中的列) 第二范式(2NF)&#xff1a;滿足第一范式&#xff1b;且不存在部分依賴&#xff0c;即非主屬性必須完全依賴于主屬性。(主屬性即主鍵&a…

minio集群部署(k8s內)

一、前言 minio的部署有幾種方式&#xff0c;分別是單節點單磁盤&#xff0c;單節點多磁盤&#xff0c;多節點多磁盤三種方式&#xff0c;本次部署使用多節點多磁盤的方式進行部署&#xff0c;minio集群多節點部署最低要求需要4個節點&#xff0c;集群擴容時也是要求擴容的節點…

2、數倉理論概述與相關概念

1、問&#xff1a;數據倉庫 建設過程中 經常會遇到那些問題&#xff1f; 模型(邏輯)重復建設 數據不一致性 維度不一致&#xff1a;命名、維度屬性值、維度定義 指標不一致&#xff1a;命名、計算口徑 數據不規范(字段命名、表名、分層、主題命名規范) 2、OneData數據建設核心方…

python爬蟲HMAC加密案例:某企業信息查詢網站

聲明&#xff1a; 該文章為學習使用&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;違者后果自負&#xff0c;由此產生的一切后果均與作者無關 一、找出需要加密的參數 js運行 atob(‘aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvc2VhcmNoP2tleT0lRTQlQjglODclRTglQkUlQkUlRTklOUI…

飛槳——總結PPOCRLabel中遇到的坑

操作系統&#xff1a;win10 python環境&#xff1a;python3.9 paddleocr項目版本&#xff1a;2.7 1.報錯&#xff1a;ModuleNotFoundError: No module named Polygon&#xff08;已解決&#xff09; 已解決所以沒有復現報錯內容 嘗試方法一&#xff1a;直接使用pip命令安裝&…

oracle rac 19.3安裝補丁19.19

使用opatchauto apply DIR來進行安裝 1.升級之前先備份一下GRID_HOME和ORACLE_HOME 2.現在新的opatch安裝不需要先停止集群和數據庫&#xff0c;在升級過程中&#xff0c;他會自動關閉和啟動集群 3.先將OPatch&#xff08;P6880880&#xff09;包拷貝到$GRID_HOME和$ORACLE_HOM…