日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
深入解讀:Linux中o_creat參數(shù)的作用 (linux o creat)

在Linux系統(tǒng)下,我們常常需要?jiǎng)?chuàng)建文件,而Linux提供了一些系統(tǒng)調(diào)用來實(shí)現(xiàn)這一功能。其中open()是一個(gè)常用的系統(tǒng)調(diào)用,它可以打開一個(gè)文件,并返回一個(gè)文件描述符,供進(jìn)程對(duì)該文件進(jìn)行讀寫操作。open()系統(tǒng)調(diào)用的第二個(gè)參數(shù)flags是一個(gè)標(biāo)志位參數(shù),用于控制打開文件的行為和屬性,其中包括o_creat參數(shù),本文將詳細(xì)解讀這一參數(shù)的作用。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供怒江州網(wǎng)站建設(shè)、怒江州做網(wǎng)站、怒江州網(wǎng)站設(shè)計(jì)、怒江州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、怒江州企業(yè)網(wǎng)站模板建站服務(wù),十余年怒江州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

1. o_creat參數(shù)的基本使用

o_creat參數(shù)的作用是在打開文件時(shí),如果文件不存在,則創(chuàng)建一個(gè)新文件。該參數(shù)可以與其他標(biāo)志位參數(shù)組合使用,從而實(shí)現(xiàn)不同的功能。下面是一些基本用法:

1.1 打開已存在的文件

用法:open(filename, flags)

這個(gè)用法與不使用o_creat參數(shù)的效果一樣,只會(huì)打開已存在的文件,并返回對(duì)應(yīng)的文件描述符。

1.2 創(chuàng)建新的文件并寫入數(shù)據(jù)

用法:open(filename, O_CREAT | O_WRON, mode)

這個(gè)用法將新建一個(gè)文件,并將mode參數(shù)賦予其指定的文件權(quán)限,同時(shí)打開文件并將數(shù)據(jù)寫入其中。其中O_CREAT參數(shù)代表如果文件不存在,則創(chuàng)建新文件,O_WRON參數(shù)代表只寫模式,即僅僅允許寫入數(shù)據(jù)。

1.3 讀取文件并創(chuàng)建新的文件

用法:open(filename, O_CREAT | O_WRON | O_TRUNC, mode)

這個(gè)用法將打開舊文件并從中讀取數(shù)據(jù),同時(shí)也會(huì)新建一個(gè)文件,并將mode參數(shù)賦予其指定的文件權(quán)限。O_CREAT參數(shù)表示如果文件不存在,則創(chuàng)建新文件,O_WRON參數(shù)代表只寫模式,O_TRUNC參數(shù)表示在打開文件時(shí)清空文件內(nèi)容。

2. o_creat參數(shù)的高級(jí)用法

o_creat參數(shù)不僅可以在基本用法中發(fā)揮作用,還可以與其他標(biāo)志位參數(shù)進(jìn)行組合,從而實(shí)現(xiàn)更復(fù)雜的功能。

2.1 設(shè)置文件的訪問權(quán)限

用法:open(filename, O_CREAT | O_EXCL | O_WRON, mode)

在新建文件時(shí),如果文件已存在則不執(zhí)行任何寫入操作,并返回錯(cuò)誤。如果文件不存在,則創(chuàng)建新文件,并用指定的mode參數(shù)賦予其指定的文件讀寫權(quán)限。O_EXCL參數(shù)表示如果文件已存在,則不會(huì)執(zhí)行創(chuàng)建操作。

2.2 保留原文件屬性并保存文件

用法:open(filename, O_CREAT | O_EXCL | O_WRON | O_NOFOLLOW, mode)

在新建文件時(shí),如果文件已存在則不執(zhí)行任何寫入操作,并返回錯(cuò)誤。如果文件不存在,則創(chuàng)建新文件,并用指定的mode參數(shù)賦予其指定的文件讀寫權(quán)限。O_EXCL參數(shù)表示如果文件已存在,則不會(huì)執(zhí)行創(chuàng)建操作。O_NOFOLLOW參數(shù)表示只能打開符號(hào)鏈接,不能打開其他文件類型。

2.3 寫入數(shù)據(jù)到文件末尾

用法:open(filename, O_CREAT | O_EXCL | O_WRON | O_APPEND, mode)

在新建文件時(shí),如果文件已存在則不執(zhí)行任何寫入操作,并返回錯(cuò)誤。如果文件不存在,則創(chuàng)建新文件,并在文件尾部添加新數(shù)據(jù)。O_EXCL參數(shù)表示如果文件已存在,則不會(huì)執(zhí)行創(chuàng)建操作。O_APPEND參數(shù)表示在文件末尾添加數(shù)據(jù)。

3.

在Linux系統(tǒng)中,o_creat參數(shù)是open()系統(tǒng)調(diào)用中的一個(gè)標(biāo)志位參數(shù),用于控制文件的創(chuàng)建和打開行為。它提供了許多高級(jí)用法,可以與其他標(biāo)志位參數(shù)組合使用,從而實(shí)現(xiàn)更復(fù)雜的功能。深入了解o_creat參數(shù)及其相關(guān)用法,有助于開發(fā)人員更好地控制文件創(chuàng)建及打開行為,提高系統(tǒng)開發(fā)效率,確保文件安全性。

相關(guān)問題拓展閱讀:

linux下一程序 if(destfd=open(“ilu.txt”,O_RDWR|O_CREATE,0666))

mode標(biāo)志激空不是5位哦歲答,0666代表打開權(quán)限,

linux下分別有user,group,other等幾種權(quán)限

user有S_IRUSR,S_IWUSR,S_IXUSR,分別代表read,write,exute(讀寫執(zhí)行)的權(quán)限用二進(jìn)制表示成100,010,001所以6就等于100+010,明雀瞎可以表示成S_IRUSR|S_IWUSR,以此類推

GRP有S_IRGRP,S_IWGRP,S_IXGRP

other有S_IROTH,S_IWOTH,S_IXOTH

當(dāng)然linux還有設(shè)置權(quán)限位可以設(shè)置為 S_ISUSR或者S_ISOTH

所以呢0666 = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH

我一般是這么寫的,要包上頭文件 sys/stat.h

樓主你好!

那你說的是open()函數(shù)中的mode_t mode吧?

mode參數(shù)激并念只有在建立新文件時(shí)才會(huì)生效(flags中包含O_CREAT),表示新建文件的權(quán)限,但最終所建文件的權(quán)明困限會(huì)受到umask值所影響,因此該文件權(quán)限應(yīng)該為(mode-umaks)。

666表示為rw-rw-rw-,即,對(duì)于用戶、組、其他都對(duì)該文件有讀寫權(quán),沒有執(zhí)行權(quán)!蔽嘩

可以通過終端命令行l(wèi)s -l可以查看的!

希望我的回答對(duì)你有幫助!

linux文件鎖定被使用

一、什么是文件鎖定

對(duì)于鎖這個(gè)字,大家一定不會(huì)陌生,因?yàn)槲覀兩钪芯痛嬖谥罅康逆i,它們各個(gè)方面發(fā)揮著它的作用,現(xiàn)在世界中的鎖的功能都可歸結(jié)為一句話,就是阻止某些人做某些事,例如,門鎖就是阻止除了屋主之外的人進(jìn)入這個(gè)房子,你進(jìn)入不到這個(gè)房子,也就不能使用房子里面的東西。

而因?yàn)槌绦蚪?jīng)常需要共享數(shù)據(jù),而這通常又是通過文件來實(shí)現(xiàn)的,試想一個(gè)情況,A進(jìn)程正在對(duì)一個(gè)文件進(jìn)行寫操作,而另一個(gè)程序B需要對(duì)同一個(gè)文件進(jìn)行讀操作,并以讀取到的數(shù)據(jù)作為自己凳悉改程序運(yùn)行時(shí)所需要的數(shù)據(jù),這會(huì)發(fā)生什么情況呢?進(jìn)程B可能會(huì)讀到錯(cuò)亂的數(shù)據(jù),因?yàn)樗⒉恢懒硪粋€(gè)進(jìn)程A正在改寫這個(gè)文件中的數(shù)據(jù)。

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

用回之前的例子就是,文件鎖就是當(dāng)文件在寫的時(shí)候,阻止其他的需要寫或者要讀文件的進(jìn)程來操作這個(gè)文件。

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

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

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

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

可以看看下面的例子:源文件文件名為filelock1.c,代碼如下:

#include #include #include #include #include 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; }

同時(shí)運(yùn)行同一個(gè)程序的兩個(gè)實(shí)例,運(yùn)行結(jié)果為:

?

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

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

三、區(qū)域鎖定

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

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

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

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

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

在Linux上為實(shí)現(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, …);

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

2、flock結(jié)構(gòu)

準(zhǔn)確來說,flock結(jié)構(gòu)依賴具體的實(shí)現(xiàn),但是它至少包括下面的成員:

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

short l_whence;從文件的哪個(gè)相對(duì)位置開始計(jì)算,對(duì)應(yīng)于SEEK_SET(文件頭),SEEK_CUR(當(dāng)前位置),SEEK_END(文件尾)中的一個(gè)。

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

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

pid_t l_pid;用來記錄參持有鎖的進(jìn)程。

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

struct flock region;

region.l_whence = SEEK_SET;

region.l_start = 10;

region.l_len = 20;

則表示fcntl函數(shù)操作鎖定的區(qū)域?yàn)槲募^開始的第10到29個(gè)字節(jié)之間的這20個(gè)字節(jié)。

3、文件鎖的類型

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

F_RDLCK:

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

簡(jiǎn)單點(diǎn)來說就是,當(dāng)一個(gè)進(jìn)程在讀文件中的數(shù)據(jù)時(shí),文件中的數(shù)據(jù)不能被改變或改寫,這是為了防止數(shù)據(jù)被改變而使讀數(shù)據(jù)的程序讀取到錯(cuò)亂的數(shù)據(jù),而文件中的同一個(gè)區(qū)域能被多個(gè)進(jìn)程同時(shí)讀取,這是容易理解的,因?yàn)樽x不會(huì)破壞數(shù)據(jù),或者說讀操作不會(huì)改變文件的數(shù)據(jù)。

F_WRLCK:

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

簡(jiǎn)單點(diǎn)來說,就是一個(gè)文件同一區(qū)域(或重疊)區(qū)域進(jìn)在同一時(shí)間,只能有一個(gè)進(jìn)程能對(duì)其進(jìn)行寫操作,并且在寫操作進(jìn)行期間,其他的進(jìn)程不能對(duì)該區(qū)域進(jìn)行讀取數(shù)據(jù)。這個(gè)要求是顯然易見的,因?yàn)槿绻麅蓚€(gè)進(jìn)程同時(shí)對(duì)一個(gè)文件進(jìn)行寫操作,就會(huì)使文件的內(nèi)容錯(cuò)亂起來,而由于寫時(shí)會(huì)改變文件中的數(shù)據(jù),所以它也不允許其他進(jìn)程對(duì)文件的數(shù)據(jù)進(jìn)行讀取和刪除文件等操作。

F_UNLCK:

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

4、不同的command的意義

在前面說到fcntl函數(shù)的command參數(shù)時(shí),說了三個(gè)命令選項(xiàng),這里將對(duì)它們進(jìn)行詳細(xì)的解說。

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

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

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

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

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

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

5、例子

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

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

#include #include #include #include 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; //打開一個(gè)文件描述符 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個(gè)‘A’字符的數(shù)據(jù) for(byte_count = 0; byte_count #include #include #include 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); } //設(shè)置區(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; //設(shè)置區(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; //

三、解空鎖問題

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

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

Linux信號(hào)量

信號(hào)量是包含一個(gè)非負(fù)整數(shù)型的變量,并且?guī)в袃蓚€(gè)原子操作wait和signal。Wait還可以被稱為down、P或lock,signal還可以被稱為up、V、unlock或post。在UNIX的API中(POSIX標(biāo)準(zhǔn))用的是wait和post。

對(duì)于wait操作,如果信號(hào)量的非負(fù)整形變量S大于0,wait就將其減1,如果S等于0,wait就將調(diào)用線程阻塞;對(duì)于post操作,如果有線程在信號(hào)量上阻塞(此時(shí)S等于0),post就會(huì)解除對(duì)某個(gè)等待線程的阻塞,使其從wait中返回,如果沒有線程阻塞在信號(hào)量上,post就將S加1.

由此可見,S可以被理解為一種資源的數(shù)量,信號(hào)量即是通過控制這種資源的分配來實(shí)現(xiàn)互斥和同步的。如果把S設(shè)為1,那么信號(hào)量即可使多線程并發(fā)運(yùn)行。另外,信號(hào)量不僅允許使用者申請(qǐng)和釋放資源,而且還允許使用者創(chuàng)豎嘩造資源,這就賦予了信號(hào)量實(shí)現(xiàn)同步的功能??梢娦盘?hào)量的功能要比互斥量豐富許多。

POSIX信號(hào)量是一個(gè)sem_t類型的變量,但POSIX有兩種信號(hào)量的實(shí)現(xiàn)機(jī)制:

無名信號(hào)量

命名信號(hào)量

。無名信號(hào)量只可以在共享內(nèi)存的情況下,比如實(shí)現(xiàn)進(jìn)程中各個(gè)線程之間的互斥和同步,因此無名信號(hào)量也被稱作基于內(nèi)存的信號(hào)量;命名信號(hào)量通常用于不共享內(nèi)存的情況下,比如進(jìn)程間通信。

同時(shí),在創(chuàng)建信號(hào)量時(shí),根據(jù)信號(hào)量取值的不同,POSIX信號(hào)量還可以分為:

下面是POSIX信號(hào)量函數(shù)接口:

信號(hào)量的函數(shù)都以sem_開頭,線程中使用的基本信號(hào)函數(shù)有4個(gè),他們都聲明在頭文件semaphore.h中,該頭文件定義了用于信號(hào)量操作的sem_t類型:

【sem_init函數(shù)】:

該函數(shù)用于創(chuàng)猜型建信號(hào)量,原型如下:

該函數(shù)初始化由sem指向的余兆行信號(hào)對(duì)象,設(shè)置它的共享選項(xiàng),并給它一個(gè)初始的整數(shù)值。pshared控制信號(hào)量的類型,如果其值為0,就表示信號(hào)量是當(dāng)前進(jìn)程的局部信號(hào)量,否則信號(hào)量就可以在多個(gè)進(jìn)程間共享,value為sem的初始值。

該函數(shù)調(diào)用成功返回0,失敗返回-1。

【sem_destroy函數(shù)】:

該函數(shù)用于對(duì)用完的信號(hào)量進(jìn)行清理,其原型如下:

成功返回0,失敗返回-1。

【sem_wait函數(shù)】:

該函數(shù)用于以原子操作的方式將信號(hào)量的值減1。原子操作就是,如果兩個(gè)線程企圖同時(shí)給一個(gè)信號(hào)量加1或減1,它們之間不會(huì)互相干擾。其原型如下:

sem指向的對(duì)象是sem_init調(diào)用初始化的信號(hào)量。調(diào)用成功返回0,失敗返回-1。

sem_trywait()則是sem_wait()的非阻塞版本,當(dāng)條件不滿足時(shí)(信號(hào)量為0時(shí)),該函數(shù)直接返回EAGAIN錯(cuò)誤而不會(huì)阻塞等待。

sem_timedwait()功能與sem_wait()類似,只是在指定的abs_timeout時(shí)間內(nèi)等待,超過時(shí)間則直接返回ETIMEDOUT錯(cuò)誤。

【sem_post函數(shù)】:

該函數(shù)用于以原子操作的方式將信號(hào)量的值加1,其原型如下:

與sem_wait一樣,sem指向的對(duì)象是由sem_init調(diào)用初始化的信號(hào)量。調(diào)用成功時(shí)返回0,失敗返回-1。

【sem_getvalue函數(shù)】:

該函數(shù)返回當(dāng)前信號(hào)量的值,通過restrict輸出參數(shù)返回。如果當(dāng)前信號(hào)量已經(jīng)上鎖(即同步對(duì)象不可用),那么返回值為0,或?yàn)樨?fù)數(shù),其絕對(duì)值就是等待該信號(hào)量解鎖的線程數(shù)。

【實(shí)例1】:

【實(shí)例2】:

之所以稱為命名信號(hào)量,是因?yàn)樗幸粋€(gè)名字、一個(gè)用戶ID、一個(gè)組ID和權(quán)限。這些是提供給不共享內(nèi)存的那些進(jìn)程使用命名信號(hào)量的接口。命名信號(hào)量的名字是一個(gè)遵守路徑名構(gòu)造規(guī)則的字符串。

【sem_open函數(shù)】:

該函數(shù)用于創(chuàng)建或打開一個(gè)命名信號(hào)量,其原型如下:

參數(shù)name是一個(gè)標(biāo)識(shí)信號(hào)量的字符串。參數(shù)oflag用來確定是創(chuàng)建信號(hào)量還是連接已有的信號(hào)量。

oflag的參數(shù)可以為0,O_CREAT或O_EXCL:如果為0,表示打開一個(gè)已存在的信號(hào)量;如果為O_CREAT,表示如果信號(hào)量不存在就創(chuàng)建一個(gè)信號(hào)量,如果存在則打開被返回,此時(shí)mode和value都需要指定;如果為O_CREAT|O_EXCL,表示如果信號(hào)量存在則返回錯(cuò)誤。

mode參數(shù)用于創(chuàng)建信號(hào)量時(shí)指定信號(hào)量的權(quán)限位,和open函數(shù)一樣,包括:S_IRUSR、S_IWUSR、S_IRGRP、S_IWGRP、S_IROTH、S_IWOTH。

value表示創(chuàng)建信號(hào)量時(shí),信號(hào)量的初始值。

【sem_close函數(shù)】:

該函數(shù)用于關(guān)閉命名信號(hào)量:

單個(gè)程序可以用sem_close函數(shù)關(guān)閉命名信號(hào)量,但是這樣做并不能將信號(hào)量從系統(tǒng)中刪除,因?yàn)槊盘?hào)量在單個(gè)程序執(zhí)行之外是具有持久性的。當(dāng)進(jìn)程調(diào)用_exit、exit、exec或從main返回時(shí),進(jìn)程打開的命名信號(hào)量同樣會(huì)被關(guān)閉。

【sem_unlink函數(shù)】:

sem_unlink函數(shù)用于在所有進(jìn)程關(guān)閉了命名信號(hào)量之后,將信號(hào)量從系統(tǒng)中刪除:

【信號(hào)量操作函數(shù)】:

與無名信號(hào)量一樣,操作信號(hào)量的函數(shù)如下:

命名信號(hào)量是隨內(nèi)核持續(xù)的。當(dāng)命名信號(hào)量創(chuàng)建后,即使當(dāng)前沒有進(jìn)程打開某個(gè)信號(hào)量,它的值依然保持,直到內(nèi)核重新自舉或調(diào)用sem_unlink()刪除該信號(hào)量。

無名信號(hào)量的持續(xù)性要根據(jù)信號(hào)量在內(nèi)存中的位置確定:

很多時(shí)候信號(hào)量、互斥量和條件變量都可以在某種應(yīng)用中使用,那這三者的差異有哪些呢?下面列出了這三者之間的差異:

關(guān)于linux o creat的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!
微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷推廣服務(wù)眾多企業(yè)。電話:028-86922220


當(dāng)前名稱:深入解讀:Linux中o_creat參數(shù)的作用 (linux o creat)
URL標(biāo)題:http://m.5511xx.com/article/dpihggi.html