Linux编程下open()函数的用法
Linux編程下open()函數的用法
open(打開文件)?
相關函數:
?read,write,fcntl,close,link,stat,umask,unlink,fopen?
表頭文件 :
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>?
定義函數:?
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
返回值:若所有欲核查的權限都通過了檢查則返回0 值,表示成功,只要有一個權限被禁止則返回-1。
一般的寫法是if((fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY)<0)
{
?perror("open");
}
這個事常用的一種用法fd是設備描述符,linux在操作硬件設備時,屏蔽了硬件的基本細節,
只把硬件當做文件來進行操作,而所有的操作都是以open函數來開始,它用來獲取fd,
然后后期的其他操作全部控制fd來完成對硬件設備的實際操作。你要打開的/dev/ttyS0,代表的是串口1,
也就是常說的com1,后面跟的是一些控制字。
函數說明:
第一個參數pathname 指向欲打開的文件路徑字符串。
第二參數flags 所能使用的旗標:
1.O_RDONLY 只讀打開。
2.O_WRONLY 只寫打開。
3.O_RDWR 讀、寫打開。
4.O_APPEND 每次寫時都加到文件的尾端。
5.O_CREAT 若此文件不存在則創建它。使用此選擇項時,需同時說明第三個參數mode,用其說明該新文件的存取許可權位。
6.O_EXCL 如果同時指定了O_CREAT,而文件已經存在,則出錯。這可測試一個文件是否存在,如果不存在則創建此文件成為一個原子操作。
7.O_TRUNC 如果此文件存在,而且為只讀或只寫成功打開,則將其長度截短為0。
8.O_NOCTTY 如果pathname指的是終端設備,則不將此設備分配作為此進程的控制終端。
9.O_NONBLOCK 如果pathname指的是一個F I F O、一個塊特殊文件或一個字符特殊文件,則此選擇項為此文件的本次打開操作和后續的I / O操作設置非阻塞方式。
10.O_NDELAY所產生的結果使I/O變成非阻塞模式(non-blocking),在讀取不到數據或是寫入緩沖區已滿會馬上return,而不會阻塞等待。
11.O_SYNC 使每次w r i t e都等到物理I / O操作完成。
12.O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件后面。
13.O_NOFOLLOW 如果參數pathname 所指的文件為一符號連接,則會令打開文件失敗。
14.O_DIRECTORY 如果參數pathname 所指的文件并非為一目錄,則會令打開文件失敗。
注意:
(1)這些控制字都是通過“或”符號分開(|)
(2)O_NONBLOCK和O_NDELAY所產生的結果都是使I/O變成非阻塞模式(non-blocking),在讀取不到數據或是寫入緩沖區已滿會馬上return,而不會阻塞等待。
它們的差別在于:在讀操作時,如果讀不到數據,O_NDELAY會使I/O函數馬上返回0,但這又衍生出一個問題,因為讀取到文件末尾(EOF)時返回的也是0,這樣無法區分是哪種情況。因此,O_NONBLOCK就產生出來,它在讀取不到數據時會回傳-1,并且設置errno為EAGAIN。
O_NDELAY是在System V的早期版本中引入的,在編碼時,還是推薦POSIX規定的O_NONBLOCK,O_NONBLOCK可以在open和fcntl時設置
(3)Linux2.2以后特有的旗標,以避免一些系統安全問題。參數mode 則有下列數種組合,只有在建立新文件時才會生效,此外真正建文件時的權限會受到umask值所影響,因此該文件權限應該為(mode-umaks)。
S_IRWXU00700 權限,代表該文件所有者具有可讀、可寫及可執行的權限。
S_IRUSR 或S_IREAD,00400權限,代表該文件所有者具有可讀取的權限。
S_IWUSR 或S_IWRITE,00200 權限,代表該文件所有者具有可寫入的權限。
S_IXUSR 或S_IEXEC,00100 權限,代表該文件所有者具有可執行的權限。
S_IRWXG 00070權限,代表該文件用戶組具有可讀、可寫及可執行的權限。
S_IRGRP 00040 權限,代表該文件用戶組具有可讀的權限。
S_IWGRP 00020權限,代表該文件用戶組具有可寫入的權限。
S_IXGRP 00010 權限,代表該文件用戶組具有可執行的權限。
S_IRWXO 00007權限,代表其他用戶具有可讀、可寫及可執行的權限。
S_IROTH 00004 權限,代表其他用戶具有可讀的權限
S_IWOTH 00002權限,代表其他用戶具有可寫入的權限。
S_IXOTH 00001 權限,代表其他用戶具有可執行的權限。
總結
以上是生活随笔為你收集整理的Linux编程下open()函数的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sigaction 函数,sigempt
- 下一篇: UART0串口编程(一):通信协议设计;