導航:首頁 > 操作系統 > linux文件有鎖

linux文件有鎖

發布時間:2022-12-24 23:28:34

linux 主分區為什麼有鎖不讓修改我該怎麼分區呢懂得來謝謝

只能劃分未分配的盤,還有win盤格式是ntfs,如果你的win盤不打算要了,可以格式化win盤的格式為ext4就能劃分了
建議先去windows下用無損分區軟體,再分出一個盤來給linux

㈡ linux文件鎖定被使用

一、什麼是文件鎖定
對於鎖這個字,大家一定不會陌生,因為我們生活中就存在著大量的鎖,它們各個方面發揮著它的作用,現在世界中的鎖的功能都可歸結為一句話,就是阻止某些人做某些事,例如,門鎖就是阻止除了屋主之外的人進入這個房子,你進入不到這個房子,也就不能使用房子裡面的東西。
而因為程序經常需要共享數據,而這通常又是通過文件來實現的,試想一個情況,A進程正在對一個文件進行寫操作,而另一個程序B需要對同一個文件進行讀操作,並以讀取到的數據作為自己程序運行時所需要的數據,這會發生什麼情況呢?進程B可能會讀到錯亂的數據,因為它並不知道另一個進程A正在改寫這個文件中的數據。
為了解決類似的問題,就出現了文件鎖定,簡單點來說,這是文件的一種安全的更新方式,當一個程序正在對文件進行寫操作時,文件就會進入一種暫時狀態,在這個狀態下,如果另一個程序嘗試讀這個文件,它就會自動停下來等待這個狀態結束。Linux系統提供了很多特性來實現文件鎖定,其中最簡單的方法就是以原子操作的方式創建鎖文件。
用回之前的例子就是,文件鎖就是當文件在寫的時候,阻止其他的需要寫或者要讀文件的進程來操作這個文件。
二、創建鎖文件
創建一個鎖文件是非常簡單的,我們可以使用open系統調用來創建一個鎖文件,在調用open時oflags參數要增加參數O_CREAT和O_EXCL標志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以創建一個鎖文件/tmp/LCK.test。O_CREAT|O_EXCL,可以確保調用者可以創建出文件,使用這個模式可以防止兩個程序同時創建同一個文件,如果文件(/tmp/LCK.test)已經存在,則open調用就會失敗,返回-1。
如果一個程序在它執行時,只需要獨占某個資源一段很短的時間,這個時間段(或代碼區)通常被叫做臨界區,我們需要在進入臨界區之前使用open系統調用創建鎖文件,然後在退出臨界區時用unlink系統調用刪除這個鎖文件。
注意:鎖文件只是充當一個指示器的角色,程序間需要通過相互協作來使用它們,也就是說鎖文件只是建議鎖,而不是強制鎖,並不會真正阻止你讀寫文件中的數據。
可以看看下面的例子:源文件文件名為filelock1.c,代碼如下:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> int main() { const char *lock_file = "/tmp/LCK.test1"; int n_fd = -1; int n_tries = 10; while(n_tries--) { //創建鎖文件 n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444); if(n_fd == -1) { //創建失敗 printf("%d - Lock already present ", getpid()); sleep(2); } else { //創建成功 printf("%d - I have exclusive access ", getpid()); sleep(1); close(n_fd); //刪除鎖文件,釋放鎖 unlink(lock_file); sleep(2); } } return 0; }
同時運行同一個程序的兩個實例,運行結果為:

從運行的結果可以看出兩個程序交叉地對對文件進行鎖定,但是真實的操作卻是,每次調用open函數去檢查/tmp/LCK.test1這個文件是否存在,如果存在open調用就失敗,顯示有進程已經把這個文件鎖定了,如果這個文件不存在,就創建這個文件,並顯示許可信息。但是這種做法有一定的缺憾,我們可以看到文件/tmp/LCK.test1被創建了很多次,也被unlink刪除了很多次,也就是說我們不能使用已經事先有數據的文件作為這種鎖文件,因為如果文件已經存在,則open調用總是失敗。
給我的感覺是,這更像是一種對進程工作的協調性安排,更像是二進制信號量的作用,文件存在為0,不存在為1,而不是真正的文件鎖定。
三、區域鎖定
我們還有一個問題,就是如果同一個文件有多個進程需要對它進行讀寫,而一個文件同一時間只能被一個進程進行寫操作,但是多個進程讀寫的區域互不相關,如果總是要等一個進程寫完其他的進程才能對其進行讀寫,效率又太低,那麼是否可以讓多個進程同時對文件進行讀寫以提高數據讀寫的效率呢?
為了解決上面提到的問題,和出現在第二點中的問題,即不能把文件鎖定到指定的已存在的數據文件上的問題,我們提出了一種新的解決方案,就是區域鎖定。
簡單點來說,區域鎖定就是,文件中的某個部分被鎖定了,但其他程序可以訪問這個文件中的其他部分。
然而,區域鎖定的創建和使用都比上面說的文件鎖定復雜很多。
1、創建區域鎖定
在Linux上為實現這一功能,我們可以使用fcntl系統調用和lockf調用,但是下面以fcntl系統調用來講解區域鎖定的創建。
fctnl的函數原理為:
int fctnl(int fildes, int command, ...);
它對一個打開的文件描述進行操作,並能根據command參數的設置完成不同的任務,它有三個可選的任務:F_GETLK,F_SETLK,F_SETLKW,至於這三個參數的意義下面再詳述。而當使用這些命令時,fcntl的第三個參數必須是一個指向flock結構的指針,所以在實際應用中,fctnl的函數原型一般為:int fctnl(int fildes, int command, struct flock *flock_st);
2、flock結構
准確來說,flock結構依賴具體的實現,但是它至少包括下面的成員:
short l_type;文件鎖的類型,對應於F_RDLCK(讀鎖,也叫共享鎖),F_UNLCK(解鎖,也叫清除鎖),F_WRLCK(寫鎖,也叫獨占鎖)中的一個。
short l_whence;從文件的哪個相對位置開始計算,對應於SEEK_SET(文件頭),SEEK_CUR(當前位置),SEEK_END(文件尾)中的一個。
off_t l_start;從l_whence開始的第l_start個位元組開始計算。
off_t l_len;鎖定的區域的長度。
pid_t l_pid;用來記錄參持有鎖的進程。
成員l_whence、l_start和l_len定義了一個文件中的一個區域,即一個連續的位元組集合,例如:
struct flock region;
region.l_whence = SEEK_SET;
region.l_start = 10;
region.l_len = 20;
則表示fcntl函數操作鎖定的區域為文件頭開始的第10到29個位元組之間的這20個位元組。
3、文件鎖的類型
從上面的flock的成員l_type的取值我們可以知道,文件鎖的類型主要有三種,這里對他們進行詳細的解說。
F_RDLCK:
從它的名字我們就可以知道,它是一個讀鎖,也叫共享鎖。許多不同的進程可以擁有文件同一(或重疊)區域上的讀(共享)鎖。而且只要任一進程擁有一把讀(共享)鎖,那麼就沒有進程可以再獲得該區域上的寫(獨占)鎖。為了獲得一把共享鎖,文件必須以「讀」或「讀/寫」方式打開。
簡單點來說就是,當一個進程在讀文件中的數據時,文件中的數據不能被改變或改寫,這是為了防止數據被改變而使讀數據的程序讀取到錯亂的數據,而文件中的同一個區域能被多個進程同時讀取,這是容易理解的,因為讀不會破壞數據,或者說讀操作不會改變文件的數據。
F_WRLCK:
從它的名字,我們就可以知道,它是一個寫鎖,也叫獨占鎖。只有一個進程可以在文件中的任一特定區域擁有一把寫(獨占)鎖。一旦一個進程擁有了這樣一把鎖,任何其他進程都無法在該區域上獲得任何類型的鎖。為了獲得一把寫(獨占)鎖,文件也必須以「讀」或「讀/寫」方式打開。
簡單點來說,就是一個文件同一區域(或重疊)區域進在同一時間,只能有一個進程能對其進行寫操作,並且在寫操作進行期間,其他的進程不能對該區域進行讀取數據。這個要求是顯然易見的,因為如果兩個進程同時對一個文件進行寫操作,就會使文件的內容錯亂起來,而由於寫時會改變文件中的數據,所以它也不允許其他進程對文件的數據進行讀取和刪除文件等操作。
F_UNLCK:
從它的名字就可以知道,它用於把一個鎖定的區域解鎖。
4、不同的command的意義
在前面說到fcntl函數的command參數時,說了三個命令選項,這里將對它們進行詳細的解說。
F_GETLK命令,它用於獲取fildes(fcntl的第一個參數)打開的文件的鎖信息,它不會嘗試去鎖定文件,調用進程可以把自己想創建的鎖類型信息傳遞給fcntl,函數調用就會返回將會阻止獲取鎖的任何信息,即它可以測試你想創建的鎖是否能成功被創建。fcntl調用成功時,返回非-1,如果鎖請求可以成功執行,flock結構將保持不變,如果鎖請求被阻止,fcntl會用相關的信息覆蓋flock結構。失敗時返回-1。
所以,如果調用成功,調用程序則可以通過檢查flock結構的內容來判斷其是否被修改過,來檢查鎖請求能否被成功執行,而又因為l_pid的值會被設置成擁有鎖的進程的標識符,所以大多數情況下,可以通過檢查這個欄位是否發生變化來判斷flock結構是否被修改過。
使用F_GETLK的fcntl函數調用後會立即返回。
舉個例子來說,例如,有一個flock結構的變數,flock_st,flock_st.l_pid = -1,文件的第10~29個位元組已經存在一個讀鎖,文件的第40~49個位元組中已經存在一個寫鎖,則調用fcntl時,如果用F_GETLK命令,來測試在第10~29個位元組中是否可以創建一個讀鎖,因為這個鎖可以被創建,所以,fcntl返回非-1,同時,flock結構的內容也不會改變,flock_st.l_pid = -1。而如果我們測試第40~49個位元組中是否可以創建一個寫鎖時,由於這個區域已經存在一個寫鎖,測試失敗,但是fcntl還是會返回非-1,只是flock結構會被這個區域相關的鎖的信息覆蓋了,flock_st.l_pid為擁有這個寫鎖的進程的進程標識符。
F_SETLK命令,這個命令試圖對fildes指向的文件的某個區域加鎖或解鎖,它的功能根據flock結構的l_type的值而定。而對於這個命令來說,flock結構的l_pid欄位是沒有意義的。如果加鎖成功,返回非-1,如果失敗,則返回-1。使用F_SETLK的fcntl函數調用後會立即返回。
F_SETLKW命令,這個命令與前面的F_SETLK,命令作用相同,但不同的是,它在無法獲取鎖時,即測試不能加鎖時,會一直等待直到可以被加鎖為止。
5、例子
看了這么多的說明,可能你已經很亂了,就用下面的例子來整清你的思想吧。
源文件名為filelock2.c,用於創建數據文件,並將文件區域加鎖,代碼如下:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> int main() { const char *test_file = "test_lock.txt"; int file_desc = -1; int byte_count = 0; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res = 0; //打開一個文件描述符 file_desc = open(test_file, O_RDWR|O_CREAT, 0666); if(!file_desc) { fprintf(stderr, "Unable to open %s for read/write ", test_file); exit(EXIT_FAILURE); } //給文件添加100個『A』字元的數據 for(byte_count = 0; byte_count < 100; ++byte_count) { write(file_desc, byte_to_write, 1); } //在文件的第10~29位元組設置讀鎖(共享鎖) region_1.l_type = F_RDLCK; region_1.l_whence = SEEK_SET; region_1.l_start = 10; region_1.l_len = 20; //在文件的40~49位元組設置寫鎖(獨占鎖) region_2.l_type = F_WRLCK; region_2.l_whence = SEEK_SET; region_2.l_start = 40; region_2.l_len = 10; printf("Process %d locking file ", getpid()); //鎖定文件 res = fcntl(file_desc, F_SETLK, ®ion_1); if(res == -1) { fprintf(stderr, "Failed to lock region 1 "); } res = fcntl(file_desc, F_SETLK, ®ion_2); if(res == -1) { fprintf(stderr, "Failed to lock region 2 "); } //讓程序休眠一分鍾,用於測試 sleep(60); printf("Process %d closing file ", getpid()); close(file_desc); exit(EXIT_SUCCESS); }
下面的源文件filelock3.c用於測試上一個文件設置的鎖,測試可否對兩個區域都加上一個讀鎖,代碼如下:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> int main() { const char *test_file = "test_lock.txt"; int file_desc = -1; int byte_count = 0; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res = 0; //打開數據文件 file_desc = open(test_file, O_RDWR|O_CREAT, 0666); if(!file_desc) { fprintf(stderr, "Unable to open %s for read/write ", test_file); exit(EXIT_FAILURE); } //設置區域1的鎖類型 struct flock region_test1; region_test1.l_type = F_RDLCK; region_test1.l_whence = SEEK_SET; region_test1.l_start = 10; region_test1.l_len = 20; region_test1.l_pid = -1; //設置區域2的鎖類型 struct flock region_test2; region_test2.l_type = F_RDLCK; region_test2.l_whence = SEEK_SET; region_test2.l_start = 40; region_test2.l_len = 10; region_test2.l_pid = -1; //
三、解空鎖問題
如果我要給在本進程中沒有加鎖的區域解鎖會發生什麼事情呢?而如果這個區域中其他的進程有對其進行加鎖又會發生什麼情況呢?
如果一個進程實際並未對一個區域進行鎖定,而調用解鎖操作也會成功,但是它並不能解其他的進程加在同一區域上的鎖。也可以說解鎖請求最終的結果取決於這個進程在文件中設置的任何鎖,沒有加鎖,但對其進行解鎖得到的還是沒有加鎖的狀態。

㈢ linux系統 updatedb被鎖怎麼辦

Ctrl+Z後,你把命令放後台了

你用jobs看看任務號,用 fg 命令把任務調到前台,等其完成,或Ctrl+c終止
或者ps -ef|grep updatedb,找到pid,然後kill掉

㈣ linux系統文件夾鎖著怎麼辦

sudo chmod 777 文件夾名字
解鎖

㈤ linux 文件鎖資源何時回收

這個是取決於應用自己的,其可能想在進程退出時,做一些額外的動作。當然其也可已不用關閉文件描述符。

㈥ linux共享鎖與排斥鎖的作用

共享鎖【S鎖】又稱讀鎖,若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。排他鎖【X鎖】又稱寫鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

㈦ linux 下 svn 每次更新都提示被鎖,哪怕我svn cleanup之後,下次還這樣,而且,提示更新了但是線上沒變

從你貼的信息來看,是SVN伺服器端的post-commit這個鉤子報錯,從報錯內容分析,估計是post-commit這個鉤子調用了svn update去更新你們的線上測試環境,但update時發現html-dev文件夾被鎖,要求你去cleanup這個文件夾。

我估計你cleanup的不是伺服器上的那個文件夾,而是你自己客戶端的這個文件夾。去把伺服器上的那個文件夾cleanup一下,然後再從你的客戶端commit一次看看效果。

㈧ Linux進程間通信(互斥鎖、條件變數、讀寫鎖、文件鎖、信號燈)

為了能夠有效的控制多個進程之間的溝通過程,保證溝通過程的有序和和諧,OS必須提供一定的同步機制保證進程之間不會自說自話而是有效的協同工作。比如在 共享內存的通信方式中,兩個或者多個進程都要對共享的內存進行數據寫入,那麼怎麼才能保證一個進程在寫入的過程中不被其它的進程打斷,保證數據的完整性 呢?又怎麼保證讀取進程在讀取數據的過程中數據不會變動,保證讀取出的數據是完整有效的呢?

常用的同步方式有: 互斥鎖、條件變數、讀寫鎖、記錄鎖(文件鎖)和信號燈.

互斥鎖:

顧名思義,鎖是用來鎖住某種東西的,鎖住之後只有有鑰匙的人才能對鎖住的東西擁有控制權(把鎖砸了,把東西偷走的小偷不在我們的討論范圍了)。所謂互斥, 從字面上理解就是互相排斥。因此互斥鎖從字面上理解就是一點進程擁有了這個鎖,它將排斥其它所有的進程訪問被鎖住的東西,其它的進程如果需要鎖就只能等待,等待擁有鎖的進程把鎖打開後才能繼續運行。 在實現中,鎖並不是與某個具體的變數進行關聯,它本身是一個獨立的對象。進(線)程在有需要的時候獲得此對象,用完不需要時就釋放掉。

互斥鎖的主要特點是互斥鎖的釋放必須由上鎖的進(線)程釋放,如果擁有鎖的進(線)程不釋放,那麼其它的進(線)程永遠也沒有機會獲得所需要的互斥鎖。

互斥鎖主要用於線程之間的同步。

條件變數:

上文中提到,對於互斥鎖而言,如果擁有鎖的進(線)程不釋放鎖,其它進(線)程永遠沒機會獲得鎖,也就永遠沒有機會繼續執行後續的邏輯。在實際環境下,一 個線程A需要改變一個共享變數X的值,為了保證在修改的過程中X不會被其它的線程修改,線程A必須首先獲得對X的鎖。現在假如A已經獲得鎖了,由於業務邏 輯的需要,只有當X的值小於0時,線程A才能執行後續的邏輯,於是線程A必須把互斥鎖釋放掉,然後繼續「忙等」。如下面的偽代碼所示:

1.// get x lock

2.while(x

㈨ linux shell中的加鎖

flock的選項-n等同於--nonblock,表示非阻塞模式。man flock可以看到詳細說明:
Fail (with an exit code of 1) rather than wait if the lock cannot be immediately acquired.
翻譯過來就是,若不能立即獲得文件鎖,就直接出錯返回1而不是繼續等待(默認flock是會繼續等待直到獲得文件鎖)。

3就是fd(即文件描述符)。

文件鎖只是用於防止多個程序同時訪問一個文件的沖突情況。
Shell自動分配fd的話,原本就不會使用已被佔用的fd,而是自動遞增。
這里顯式指定fd為3(3<>mylockfile),是為了flock有操作的對象。只有unlock後文件才能被其他程序訪問,這樣就可以保證文件訪問不沖突。

㈩ linux 生成的.o文件為什麼帶鎖標志

那可能是編譯源代碼文件成.o時,是用root用戶身份執行的gcc/g++命令,所以產生的.o文件也屬於root用戶。屬於root用戶的文件在Linux圖形界面的文件管理器中,會有一個帶鎖的標志。

閱讀全文

與linux文件有鎖相關的資料

熱點內容
公路商店app標簽選什麼 瀏覽:335
linuxoracle命令行登錄 瀏覽:224
android深度休眠 瀏覽:169
php微信開發例子 瀏覽:843
醫得app登錄密碼是什麼 瀏覽:140
spring開發伺服器地址 瀏覽:411
伺服器上如何查看伺服器的埠 瀏覽:678
單片機伺服器編譯 瀏覽:770
單口usb列印機伺服器是什麼 瀏覽:859
戰地五開伺服器要什麼條件 瀏覽:956
在word中壓縮圖片大小 瀏覽:255
javatomcat圖片 瀏覽:419
程序員生產智能創意 瀏覽:67
匯和銀行app怎麼登錄 瀏覽:383
騰訊伺服器如何上傳源碼 瀏覽:748
單片機的原理概述 瀏覽:512
火控pdf 瀏覽:269
如何復制雲伺服器centos環境 瀏覽:988
債權pdf 瀏覽:307
紅色番字的app怎麼下載 瀏覽:876