open函數詳解


轉載:https://www.cnblogs.com/frank-yxs/p/5925574.html

open函數用來在進程中打開文件,如果成功則返回一個文件描述符fd。

=======================================================
函數原型:
函數參數:
  • pathname:打開文件的路徑名
  • flags:用來控制打開文件的模式
  • mode:用來設置創建文件的權限(rwx)。當flags中帶有O_CREAT時才有效。
返回值:
  • 調用成功時返回一個文件描述符fd
  • 調用失敗時返回-1,並修改errno
=======================================================
flags參數詳解:
  • O_RDONLY:只讀模式
  • O_WRONLY:只寫模式
  • O_RDWR:可讀可寫模式
上面三種模式在flags參數中不能同時出現但必須有一種出現,下面的參數是可選的。
  • O_APPEND:以后每次寫文件時都會先將當前文件偏移量設置到文件末尾,但是讀文件時時不影響的
  • O_CREAT:如果文件不存在則創建
  • O_EXCL:要打開的文件如果存在則出錯,必須要和O_CREAT參數一起使用
  • O_TRUNC:打開文件的同時將文件中的內容清除
  • O_NOCTTY:如果打開的文件是終端設備,則不將此設備設置為進程的控制終端
  • O_NONBLOCK:如果打開的文件是一個管道、一個塊設備文件或一個字符設備文件,則后續的I/O操作均設置為非阻塞方式
  • O_SYNC:使每次write都等到物理I/O操作完成,包括由該write操作引起的文件屬性更新所需的I/O。
========================================================
    open函數返回的文件描述符fd一定是未使用的最小的文件描述符。利用這個特性,可以改變0,1,2這三個文件描述符所指向的文件,由於進程默認會打開0,1,2這三個文件描述符,而且指向了鍵盤和顯示器的設備文件。如果在open之前先進行close(1),然后再調用open函數就會返回最小的未使用的fd,也就是1。
 =======================================================
    如果文件不存在,而且又使用了O_CREAT標志,也就是會創建文件,創建文件時會給文件一定的權限,但是這個權限並不會限制該進程后面對該文件的操作。舉個例子,如果創建文件時給的權限是0555,也就是所有用戶都沒有寫的權限。但是程序后面還是可以對文件進行寫操作。
=======================================================
    當mode參數是由八進制數字給出的時候,如 0777 .要糾正一個錯誤,就是之前我認為 權限數字前面的 0 代表的是八進制的含義,其實並不是這樣的,前面的 0 代表了權限修飾位,也就是set-user-id位、set-group-id位和sticky這三位的權限。
=======================================================
    creat函數相當於open(pathname,  O_WRONLY | O_CREAT | O_TRUNC, mode),由於open函數完全可以替代creat函數,所以現在基本上不用creat函數了。


免責聲明!

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



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