真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux命令獲取文件鎖 linux文件解鎖命令

Linux下怎么創(chuàng)建鎖文件及相關命令

方法鎖文件僅僅是充當一個指示器的角色,程序間需要通過相互協(xié)作來使用它們。鎖文件只是建議性鎖,與此對立的是強制性鎖。 為創(chuàng)建一個用作指示器的文件,我們使用帶O_CREATE和O_EXCL標志的open系統(tǒng)調(diào)用。這將使我們以一個原子操作同時完成兩項工作:確定文件不存在,然后創(chuàng)建它。 實現(xiàn)//file : lock.c #i nclude #i nclude #i nclude #i nclude #i nclude int main(){int file_desc; int save_errno; file_desc = open(/tmp/LockFile.test, O_RDWR   O_CREAT   O_EXCL, 0444); if (file_desc 0){save_errno = errno; printf(Open failed with error is %dn, save_errno);}else {printf(Open succeededn);}exit(EXIT_SUCCESS);}第一次運行程序:$ lock輸出如下: Open succeeded 我們再次運行程序:$ lock輸出如下: Open failed with error is 17分析:第一次運行程序時,由于文件并不存在,所以執(zhí)行成功。對于后續(xù)的執(zhí)行,因為文件已經(jīng)存在而失敗了。若想程序再次執(zhí)行成功,必須刪除鎖文件。 在Linux系統(tǒng)中,通常錯誤號碼17代表的是EEXIST,此錯誤用以表示一個文件已存在。錯誤號定義在頭文件errno.h或(更常見的)它所包含的頭文件中。

創(chuàng)新互聯(lián)服務項目包括鄉(xiāng)寧網(wǎng)站建設、鄉(xiāng)寧網(wǎng)站制作、鄉(xiāng)寧網(wǎng)頁制作以及鄉(xiāng)寧網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鄉(xiāng)寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到鄉(xiāng)寧省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

linux下文件鎖了!root權限登入但提示權限不夠!源文件沒有!是不是只有訪問權限沒有修改權限!

你要獲取管理員權限,可能你在安裝的時候,默認用戶名為root,你沒有修改

你可以嘗試一下方法

1、添加用戶,首先用adduser命令添加一個普通用戶,命令如下:

#adduser tommy

//添加一個名為tommy的用戶

#passwd tommy //修改密碼

Changing password for user tommy.

New UNIX password: //在這里輸入新密碼

Retype new UNIX password: //再次輸入新密碼

passwd: all authentication tokens updated successfully.

2、賦予root權限

方法一: 修改 /etc/sudoers 文件,找到下面一行,把前面的注釋(#)去掉

## Allows people in group wheel to run all commands

%wheel ALL=(ALL) ALL

然后修改用戶,使其屬于root組(wheel),命令如下:

#usermod -g root tommy

修改完畢,現(xiàn)在可以用tommy帳號登錄,然后用命令 su - ,即可獲得root權限進行操作。

方法二: 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:

## Allow root to run any commands anywhere

root ALL=(ALL) ALL

tommy ALL=(ALL) ALL

修改完畢,現(xiàn)在可以用tommy帳號登錄,然后用命令 su - ,即可獲得root權限進行操作。

方法三: 修改 /etc/passwd 文件,找到如下行,把用戶ID修改為 0 ,如下所示:

tommy:x:500:500:tommy:/home/tommy:/bin/bash

修改后如下

tommy:x:0:500:tommy:/home/tommy:/bin/bash

保存,用tommy賬戶登錄后,直接獲取的就是root帳號的權限。

友情提醒:雖然方法三看上去簡單方便,但一般不推薦使用,推薦使用方法二。

linux里的文件夾上有個鎖頭的圖標,表示什么

Linux中帶鎖的文件夾圖標表示沒有權限訪問該文件夾。取消linux文件上面的小鎖頭方法:

1、首先點擊任務欄上面的≥,或者是在桌面空白處不要點擊任何軟件。

2、按一下鼠標右鍵,選擇終端打開。

3、打開終端后看到@前面有個名字,這個就是自己的用戶名。

4、接著輸入命令:sudochown+名字。

5、把這個帶有鎖頭的文件拖入到命令后面,按鍵盤回車鍵。

6、接著輸入管理員密碼,這鎖頭就消失不見了。

linux文件鎖定被使用

一、什么是文件鎖定

對于鎖這個字,大家一定不會陌生,因為我們生活中就存在著大量的鎖,它們各個方面發(fā)揮著它的作用,現(xiàn)在世界中的鎖的功能都可歸結為一句話,就是阻止某些人做某些事,例如,門鎖就是阻止除了屋主之外的人進入這個房子,你進入不到這個房子,也就不能使用房子里面的東西。

而因為程序經(jīng)常需要共享數(shù)據(jù),而這通常又是通過文件來實現(xiàn)的,試想一個情況,A進程正在對一個文件進行寫操作,而另一個程序B需要對同一個文件進行讀操作,并以讀取到的數(shù)據(jù)作為自己程序運行時所需要的數(shù)據(jù),這會發(fā)生什么情況呢?進程B可能會讀到錯亂的數(shù)據(jù),因為它并不知道另一個進程A正在改寫這個文件中的數(shù)據(jù)。

為了解決類似的問題,就出現(xiàn)了文件鎖定,簡單點來說,這是文件的一種安全的更新方式,當一個程序正在對文件進行寫操作時,文件就會進入一種暫時狀態(tài),在這個狀態(tài)下,如果另一個程序嘗試讀這個文件,它就會自動停下來等待這個狀態(tài)結束。Linux系統(tǒng)提供了很多特性來實現(xiàn)文件鎖定,其中最簡單的方法就是以原子操作的方式創(chuàng)建鎖文件。

用回之前的例子就是,文件鎖就是當文件在寫的時候,阻止其他的需要寫或者要讀文件的進程來操作這個文件。

二、創(chuàng)建鎖文件

創(chuàng)建一個鎖文件是非常簡單的,我們可以使用open系統(tǒng)調(diào)用來創(chuàng)建一個鎖文件,在調(diào)用open時oflags參數(shù)要增加參數(shù)O_CREAT和O_EXCL標志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以創(chuàng)建一個鎖文件/tmp/LCK.test。O_CREAT|O_EXCL,可以確保調(diào)用者可以創(chuàng)建出文件,使用這個模式可以防止兩個程序同時創(chuàng)建同一個文件,如果文件(/tmp/LCK.test)已經(jīng)存在,則open調(diào)用就會失敗,返回-1。

如果一個程序在它執(zhí)行時,只需要獨占某個資源一段很短的時間,這個時間段(或代碼區(qū))通常被叫做臨界區(qū),我們需要在進入臨界區(qū)之前使用open系統(tǒng)調(diào)用創(chuàng)建鎖文件,然后在退出臨界區(qū)時用unlink系統(tǒng)調(diào)用刪除這個鎖文件。

注意:鎖文件只是充當一個指示器的角色,程序間需要通過相互協(xié)作來使用它們,也就是說鎖文件只是建議鎖,而不是強制鎖,并不會真正阻止你讀寫文件中的數(shù)據(jù)。

可以看看下面的例子:源文件文件名為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--) { //創(chuàng)建鎖文件 n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444); if(n_fd == -1) { //創(chuàng)建失敗 printf("%d - Lock already present ", getpid()); sleep(2); } else { //創(chuàng)建成功 printf("%d - I have exclusive access ", getpid()); sleep(1); close(n_fd); //刪除鎖文件,釋放鎖 unlink(lock_file); sleep(2); } } return 0; }

同時運行同一個程序的兩個實例,運行結果為:

?

從運行的結果可以看出兩個程序交叉地對對文件進行鎖定,但是真實的操作卻是,每次調(diào)用open函數(shù)去檢查/tmp/LCK.test1這個文件是否存在,如果存在open調(diào)用就失敗,顯示有進程已經(jīng)把這個文件鎖定了,如果這個文件不存在,就創(chuàng)建這個文件,并顯示許可信息。但是這種做法有一定的缺憾,我們可以看到文件/tmp/LCK.test1被創(chuàng)建了很多次,也被unlink刪除了很多次,也就是說我們不能使用已經(jīng)事先有數(shù)據(jù)的文件作為這種鎖文件,因為如果文件已經(jīng)存在,則open調(diào)用總是失敗。

給我的感覺是,這更像是一種對進程工作的協(xié)調(diào)性安排,更像是二進制信號量的作用,文件存在為0,不存在為1,而不是真正的文件鎖定。

三、區(qū)域鎖定

我們還有一個問題,就是如果同一個文件有多個進程需要對它進行讀寫,而一個文件同一時間只能被一個進程進行寫操作,但是多個進程讀寫的區(qū)域互不相關,如果總是要等一個進程寫完其他的進程才能對其進行讀寫,效率又太低,那么是否可以讓多個進程同時對文件進行讀寫以提高數(shù)據(jù)讀寫的效率呢?

為了解決上面提到的問題,和出現(xiàn)在第二點中的問題,即不能把文件鎖定到指定的已存在的數(shù)據(jù)文件上的問題,我們提出了一種新的解決方案,就是區(qū)域鎖定。

簡單點來說,區(qū)域鎖定就是,文件中的某個部分被鎖定了,但其他程序可以訪問這個文件中的其他部分。

然而,區(qū)域鎖定的創(chuàng)建和使用都比上面說的文件鎖定復雜很多。

1、創(chuàng)建區(qū)域鎖定

在Linux上為實現(xiàn)這一功能,我們可以使用fcntl系統(tǒng)調(diào)用和lockf調(diào)用,但是下面以fcntl系統(tǒng)調(diào)用來講解區(qū)域鎖定的創(chuàng)建。

fctnl的函數(shù)原理為:

int fctnl(int fildes, int command, ...);

它對一個打開的文件描述進行操作,并能根據(jù)command參數(shù)的設置完成不同的任務,它有三個可選的任務:F_GETLK,F(xiàn)_SETLK,F_SETLKW,至于這三個參數(shù)的意義下面再詳述。而當使用這些命令時,fcntl的第三個參數(shù)必須是一個指向flock結構的指針,所以在實際應用中,fctnl的函數(shù)原型一般為:int fctnl(int fildes, int command, struct flock *flock_st);

2、flock結構

準確來說,flock結構依賴具體的實現(xiàn),但是它至少包括下面的成員:

short l_type;文件鎖的類型,對應于F_RDLCK(讀鎖,也叫共享鎖),F(xiàn)_UNLCK(解鎖,也叫清除鎖),F(xiàn)_WRLCK(寫鎖,也叫獨占鎖)中的一個。

short l_whence;從文件的哪個相對位置開始計算,對應于SEEK_SET(文件頭),SEEK_CUR(當前位置),SEEK_END(文件尾)中的一個。

off_t l_start;從l_whence開始的第l_start個字節(jié)開始計算。

off_t l_len;鎖定的區(qū)域的長度。

pid_t l_pid;用來記錄參持有鎖的進程。

成員l_whence、l_start和l_len定義了一個文件中的一個區(qū)域,即一個連續(xù)的字節(jié)集合,例如:

struct flock region;

region.l_whence = SEEK_SET;

region.l_start = 10;

region.l_len = 20;

則表示fcntl函數(shù)操作鎖定的區(qū)域為文件頭開始的第10到29個字節(jié)之間的這20個字節(jié)。

3、文件鎖的類型

從上面的flock的成員l_type的取值我們可以知道,文件鎖的類型主要有三種,這里對他們進行詳細的解說。

F_RDLCK:

從它的名字我們就可以知道,它是一個讀鎖,也叫共享鎖。許多不同的進程可以擁有文件同一(或重疊)區(qū)域上的讀(共享)鎖。而且只要任一進程擁有一把讀(共享)鎖,那么就沒有進程可以再獲得該區(qū)域上的寫(獨占)鎖。為了獲得一把共享鎖,文件必須以“讀”或“讀/寫”方式打開。

簡單點來說就是,當一個進程在讀文件中的數(shù)據(jù)時,文件中的數(shù)據(jù)不能被改變或改寫,這是為了防止數(shù)據(jù)被改變而使讀數(shù)據(jù)的程序讀取到錯亂的數(shù)據(jù),而文件中的同一個區(qū)域能被多個進程同時讀取,這是容易理解的,因為讀不會破壞數(shù)據(jù),或者說讀操作不會改變文件的數(shù)據(jù)。

F_WRLCK:

從它的名字,我們就可以知道,它是一個寫鎖,也叫獨占鎖。只有一個進程可以在文件中的任一特定區(qū)域擁有一把寫(獨占)鎖。一旦一個進程擁有了這樣一把鎖,任何其他進程都無法在該區(qū)域上獲得任何類型的鎖。為了獲得一把寫(獨占)鎖,文件也必須以“讀”或“讀/寫”方式打開。

簡單點來說,就是一個文件同一區(qū)域(或重疊)區(qū)域進在同一時間,只能有一個進程能對其進行寫操作,并且在寫操作進行期間,其他的進程不能對該區(qū)域進行讀取數(shù)據(jù)。這個要求是顯然易見的,因為如果兩個進程同時對一個文件進行寫操作,就會使文件的內(nèi)容錯亂起來,而由于寫時會改變文件中的數(shù)據(jù),所以它也不允許其他進程對文件的數(shù)據(jù)進行讀取和刪除文件等操作。

F_UNLCK:

從它的名字就可以知道,它用于把一個鎖定的區(qū)域解鎖。

4、不同的command的意義

在前面說到fcntl函數(shù)的command參數(shù)時,說了三個命令選項,這里將對它們進行詳細的解說。

F_GETLK命令,它用于獲取fildes(fcntl的第一個參數(shù))打開的文件的鎖信息,它不會嘗試去鎖定文件,調(diào)用進程可以把自己想創(chuàng)建的鎖類型信息傳遞給fcntl,函數(shù)調(diào)用就會返回將會阻止獲取鎖的任何信息,即它可以測試你想創(chuàng)建的鎖是否能成功被創(chuàng)建。fcntl調(diào)用成功時,返回非-1,如果鎖請求可以成功執(zhí)行,flock結構將保持不變,如果鎖請求被阻止,fcntl會用相關的信息覆蓋flock結構。失敗時返回-1。

所以,如果調(diào)用成功,調(diào)用程序則可以通過檢查flock結構的內(nèi)容來判斷其是否被修改過,來檢查鎖請求能否被成功執(zhí)行,而又因為l_pid的值會被設置成擁有鎖的進程的標識符,所以大多數(shù)情況下,可以通過檢查這個字段是否發(fā)生變化來判斷flock結構是否被修改過。

使用F_GETLK的fcntl函數(shù)調(diào)用后會立即返回。

舉個例子來說,例如,有一個flock結構的變量,flock_st,flock_st.l_pid = -1,文件的第10~29個字節(jié)已經(jīng)存在一個讀鎖,文件的第40~49個字節(jié)中已經(jīng)存在一個寫鎖,則調(diào)用fcntl時,如果用F_GETLK命令,來測試在第10~29個字節(jié)中是否可以創(chuàng)建一個讀鎖,因為這個鎖可以被創(chuàng)建,所以,fcntl返回非-1,同時,flock結構的內(nèi)容也不會改變,flock_st.l_pid = -1。而如果我們測試第40~49個字節(jié)中是否可以創(chuàng)建一個寫鎖時,由于這個區(qū)域已經(jīng)存在一個寫鎖,測試失敗,但是fcntl還是會返回非-1,只是flock結構會被這個區(qū)域相關的鎖的信息覆蓋了,flock_st.l_pid為擁有這個寫鎖的進程的進程標識符。

F_SETLK命令,這個命令試圖對fildes指向的文件的某個區(qū)域加鎖或解鎖,它的功能根據(jù)flock結構的l_type的值而定。而對于這個命令來說,flock結構的l_pid字段是沒有意義的。如果加鎖成功,返回非-1,如果失敗,則返回-1。使用F_SETLK的fcntl函數(shù)調(diào)用后會立即返回。

F_SETLKW命令,這個命令與前面的F_SETLK,命令作用相同,但不同的是,它在無法獲取鎖時,即測試不能加鎖時,會一直等待直到可以被加鎖為止。

5、例子

看了這么多的說明,可能你已經(jīng)很亂了,就用下面的例子來整清你的思想吧。

源文件名為filelock2.c,用于創(chuàng)建數(shù)據(jù)文件,并將文件區(qū)域加鎖,代碼如下:

#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’字符的數(shù)據(jù) for(byte_count = 0; byte_count 100; ++byte_count) { write(file_desc, byte_to_write, 1); } //在文件的第10~29字節(jié)設置讀鎖(共享鎖) region_1.l_type = F_RDLCK; region_1.l_whence = SEEK_SET; region_1.l_start = 10; region_1.l_len = 20; //在文件的40~49字節(jié)設置寫鎖(獨占鎖) 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用于測試上一個文件設置的鎖,測試可否對兩個區(qū)域都加上一個讀鎖,代碼如下:

#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; //打開數(shù)據(jù)文件 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); } //設置區(qū)域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; //設置區(qū)域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; //

三、解空鎖問題

如果我要給在本進程中沒有加鎖的區(qū)域解鎖會發(fā)生什么事情呢?而如果這個區(qū)域中其他的進程有對其進行加鎖又會發(fā)生什么情況呢?

如果一個進程實際并未對一個區(qū)域進行鎖定,而調(diào)用解鎖操作也會成功,但是它并不能解其他的進程加在同一區(qū)域上的鎖。也可以說解鎖請求最終的結果取決于這個進程在文件中設置的任何鎖,沒有加鎖,但對其進行解鎖得到的還是沒有加鎖的狀態(tài)。


標題名稱:linux命令獲取文件鎖 linux文件解鎖命令
網(wǎng)站URL:http://weahome.cn/article/ddssicp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部