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