轉載: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函數了。