基本IO函數的使用(open,write,read)(一)

首先感謝作者的工作,謝謝了,轉到這裏都是我需要過的

=>#include <fcntl.h> =>/usr/include/bits/fcntl.h ,裏面有

/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
located on an ext2 file system */
#define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#define O_CREAT 0100 /* not fcntl */
#define O_EXCL 0200 /* not fcntl */
#define O_NOCTTY 0400 /* not fcntl */
#define O_TRUNC 01000 /* not fcntl */
#define O_APPEND 02000
#define O_NONBLOCK 04000
#define O_NDELAY O_NONBLOCK
#define O_SYNC 010000
#define O_FSYNC O_SYNC
#define O_ASYNC 020000

摘要:本文簡單介紹文件操作的三個函數(open,read,write)的基本用法。
詳細說明了open函數的用法。

作者:zieckey (zieckey@yahoo.com.cn)
All Rights Reserved!

所需頭文件:
#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);

函數說明:
參數 pathname 指向欲打開的文件路徑字符串。下列是參數 flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR以可讀寫方式打開文件。
上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用 OR(|)運算符組合。

O_CREAT 若欲打開的文件不存在則自動建立該文件。
O_EXCL 如果 O_CREAT 也被設置, 此指令會去檢查文件是否存在。文件若不存在則建立該文件,
否則將導致打開文件錯誤。 此外,若 O_CREAT 與 O_EXCL 同時設置, 並且欲打開的文件爲符號連接,則會打開文件失敗。
O_NOCTTY 如果欲打開的文件爲終端機設備時,則不會將該終端機當成進程控制終端機。
O_TRUNC 若文件存在並且以可寫的方式打開時,此旗標會令文件長度清爲 0,而原來存於該文件的資料也會消失。
O_APPEND 當讀寫文件時會從文件尾開始移動, 也就是所寫入的數據會以附加的方式加入到文件後面。
O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數據讀取或等待,都會立即返回進程之中。
O_NDELAY 同 O_NONBLOCK。
O_SYNC 以同步的方式打開文件。
O_NOFOLLOW 如果參數 pathname 所指的文件爲一符號連接,則會令打開文件失敗。
O_DIRECTORY 如果參數 pathname 所指的文件並非爲一目錄, 則
會令打開文件失敗。此爲 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 權限,代表其他用戶具有可執行的權限。


返回值:
若所有欲覈查的權限都通過了檢查則返回 0 值,表示成功,只要有 一個權限被禁止則返回-1。

錯誤代碼:
EEXIST 參數 pathname 所指的文件已存在,卻使用了 O_CREAT和 O_EXCL 旗標
EACCESS 參數 pathname 所指的文件不符合所要求測試的權限。
EROFS 欲測試寫入權限的文件存在於只讀文件系統內。
EFAULT 參數 pathname 指針超出可存取內存空間。
EINVAL 參數 mode 不正確。
ENAMETOOLONG 參數 pathname 太長。
ENOTDIR 參數 pathname 不是目錄。
ENOMEM 核心內存不足。
ELOOP 參數 pathname 有過多符號連接問題。
EIO I/O 存取錯誤。

範例:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
int fd,size;
char s[]="This program is used to show how to use open(),write(),read() function.\nHave fun!\n";
char buffer[80];

fd = open( "temp.log", O_WRONLY|O_CREAT );//以可讀寫的方式打開一個文件,如果不存在則創建該文件

if ( -1 == fd )
{
printf("Open or create file named \"temp.log\" failed.\n");
return -1;
}
write( fd, s, sizeof(s) );//向該文件中寫入一個字符串

close( fd );

fd = open( "temp.log", O_RDONLY );
if ( -1 == fd )
{
printf("Open file named \"temp.log\" failed.\n");
return -1;
}
size = read( fd, buffer, sizeof(buffer) );//讀取文件內容保存到buffer指定的字符串數組中,返回讀取的字符個數

close( fd );
printf( "%s", buffer );

return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章