(八)open函數的flag詳解


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)當我們附帶了權限后,打開的文件就只能按照這種權限來操作。

3.1.4.2、打開存在並有內容的文件時:O_APPEND、O_TRUNC
(1)思考一個問題:當我們打開一個已經存在並且內部有內容的文件時會怎么樣?
可能結果1:新內容會替代原來的內容(原來的內容就不見了,丟了)
可能結果2:新內容添加在前面,原來的內容繼續在后面
可能結果3:新內容附加在后面,原來的內容還在前面
可能結果4:不讀不寫的時候,原來的文件中的內容保持不變
(2)O_TRUNC屬性去打開文件時,如果這個文件中本來是有內容的,則原來的內容會被丟棄。這就對應上面的結果1
(3)O_APPEND屬性去打開文件時,如果這個文件中本來是有內容的,則新寫入的內容會接續到原來內容的后面,對應結果3
(4)默認不使用O_APPEND和O_TRUNC屬性時就是結果4
(5)如果O_APPEND和O_TRUNC同時出現會怎么樣?

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標志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM