八 open函式的flag詳解

2022-08-01 08:51:10 字數 2232 閱讀 5892

3.1.4.open函式的flag詳解1

3.1.4.1、讀寫許可權:o_rdonly o_wronly o_rdwr

(1)linux中檔案有讀寫許可權,我們在open開啟檔案時也可以附帶一定的許可權說明(譬如o_rdonly就表示以唯讀方式開啟,o_wronly表示以只寫方式開啟,o_rdwr表示以可讀可寫方式開啟)

(2)當我們附帶了許可權後,開啟的檔案就只能按照這種許可權來操作。

(1)思考乙個問題:當我們開啟乙個已經存在並且內部有內容的檔案時會怎麼樣?

可能結果1:新內容會替代原來的內容(原來的內容就不見了,丟了)

可能結果2:新內容新增在前面,原來的內容繼續在後面

可能結果3:新內容附加在後面,原來的內容還在前面

可能結果4:不讀不寫的時候,原來的檔案中的內容保持不變

(2)o_trunc屬性去開啟檔案時,如果這個檔案中本來是有內容的,則原來的內容會被丟棄。這就對應上面的結果1

3.1.4.3、exit、_exit、_exit退出程序

(1)當我們程式在前面步驟操作失敗導致後面的操作都沒有可能進行下去時,應該在前面的錯誤監測中結束整個程式,不應該繼續讓程式執行下去了。

(2)我們如何退出程式?

第一種;在main用return,一般原則是程式正常終止return 0,如果程式異常終止則return -1。

第一種:正式終止程序(程式)應該使用exit或者_exit或者_exit之一。

3.1.5.open函式的flag詳解2

3.1.5.1、開啟不存在的檔案時:o_creat、o_excl

(1)思考:當我們去開啟乙個並不存在的檔案時會怎樣?當我們open開啟乙個檔案時如果這個檔名不存在則會開啟檔案錯誤。

(2)vi或者windows下的notepad++,都可以直接開啟乙個尚未存在的檔案。

(3)open的flag o_creat就是為了應對這種開啟乙個並不存在的檔案的。o_creat就表示我們當前開啟的檔案並不存在,我們是要去建立並且開啟它。

(4)思考:當我們open使用了o_creat,但是檔案已經存在的情況下會怎樣?結果是報錯嗎?

(5)結論:open中加入o_creat後,不管原來這個檔案存在與否都能開啟成功,如果原來這個檔案不存在則建立乙個空的新檔案,如果原來這個檔案存在則會重新建立這個檔案,原來的內容會被消除掉(有點類似於先刪除原來的檔案再建立乙個新的)

(6)這樣可能帶來乙個問題?我們本來是想去建立乙個新檔案的,但是把檔名搞錯了弄成了乙個老檔名,結果老檔案就被意外修改了。我們希望的效果是:如果我creat要建立的是乙個已經存在的名字的檔案,則給我報錯,不要去建立。

(7)這個效果就要靠o_excl標誌和o_creat標誌來結合使用。當這連個標誌一起的時候,則沒有檔案時建立檔案,有這個檔案時會報錯提醒我們。

(8)open函式在使用o_creat標誌去建立檔案時,可以使用第三個引數mode來指定要建立的檔案的許可權。mode使用4個數字來指定許可權的,其中後面三個很重要,對應我們要建立的這個檔案的許可權標誌。譬如一般建立乙個可讀可寫不可執行的檔案就用0666

3.1.5.2、o_nonblock

(1)阻塞與非阻塞。如果乙個函式是阻塞式的,則我們呼叫這個函式時當前程序有可能被卡住(阻塞住,實質是這個函式內部要完成的事情條件不具備,當前沒法做,要等待條件成熟),函式被阻塞住了就不能立刻返回;如果乙個函式是非阻塞式的那麼我們呼叫這個函式後一定會立即返回,但是函式有沒有完成任務不一定。

(2)阻塞和非阻塞是兩種不同的設計思路,並沒有好壞。總的來說,阻塞式的結果有保障但是時間沒保障;非阻塞式的時間有保障但是結果沒保障。

(3)作業系統提供的api和由api封裝而成的庫函式,有很多本身就是被設計為阻塞式或者非阻塞式的,所以我們應用程度呼叫這些函式的時候心裡得非常清楚。

(4)我們開啟乙個檔案預設就是阻塞式的,如果你希望以非阻塞的方式開啟檔案,則flag中要加o_nonblock標誌。

(2)只用於裝置檔案,而不用於普通檔案。比如說串列埠、iic等都是通過檔案來訪問的,就存在阻塞式和非阻塞式區別。

3.1.5.3、o_sync

(1)write阻塞等待底層完成寫入才返回到應用層。

(2)無o_sync時write只是將內容寫入底層緩衝區即可返回,然後底層(作業系統中負責實現open、write這些操作的那些**,也包含os中讀寫硬碟等底層硬體的**)在合適的時候會將buf中的內容一次性的同步到硬碟中。這種設計是為了提公升硬體操作的效能和銷量,提公升硬體壽命;但是有時候我們希望硬體不要等待,直接將我們的內容寫入硬碟中,這時候就可以用o_sync標誌。

open函式的flag詳解2

朱老師物聯網大講堂 學習筆記 上節討論的前提是檔案存在,進而討論那些內容,那如果檔案不存在呢?當我們去開啟乙個並不存在的檔案時,就會檔案開啟錯誤的!o creat,建立並開啟,fd open a.txt o rdwr o creat 那如果檔案存在,還這樣做會怎楊?試試,原來的檔案會被刪除,然後重新...

open函式以及函式中flag常用的巨集詳解

int open const char pathname,int flags,mode t mode 功能 開啟或建立檔案 pathname 檔案路徑 flag 開啟檔案時的許可權 o rdonly 唯讀 o wronly 只寫 o rdwr 讀寫 o creat 檔案不存在時則建立 o excl ...

Linux中open函式詳解

open 開啟檔案 相關函式 read,write,fcntl,close,link,stat,umask,unlink,fopen 頭文件 include include include 定義函式 int open const char pathname,int flags int open co...