1. 程式人生 > >跟著iMX28x開發套件學linux-04

跟著iMX28x開發套件學linux-04

二、linux應用程式設計之二檔案I/O

Linux中一切皆檔案,無論是應用程式設計還是驅動開發,檔案IO程式設計都是必須的。檔案I/O程式設計要掌握幾個函式,分別是creat(),open(),write(),read(),lseek(),close(),ioctl(),fsync()。

creat();

1) 函式原型 int creat(const char *pathname, mode_t mode);

2) 函式輸入 *pathname,檔案全名(可帶路徑);

 mode,使用者讀寫模式,可以與chmod所用引數一樣;

3) 

int,成功返回檔案描述符fd,失敗返回-1

4)      fd = create(“hello.txt”,  0x644);

open();

1) 函式原型 int open(const char *pathname, int flags, ... /* mode_t mode */);

2) 函式輸入 *pathname,檔案全名(可帶路徑);

         flags,開啟選項,包括讀寫方式,是否建立等等;

         mode,使用者讀寫模式,可以與chmod所用引數一樣;

3) 

int,成功返回檔案描述符,失敗返回-1

4)      fd = open(“hello.txt”,  O_RDWR|O_CREAT,  0X644);

注意:只有在flags引數中輸出了O_CREATmode引數才有效,否則就算沒有hello.txt也不會建立,0x644也就失去了作用。flags主要取值如下:

引數名

開啟檔案標誌

描述

flags

O_RDONLY

以只讀方式開啟檔案,與 O_WRONLY

O_RDWR 互斥

O_WRONLY

以只寫方式開啟檔案,與 O_RDONLY O_RDWR 互斥

O_RDWR

以可讀寫方式開啟檔案,與 O_WRONLY O_RDONLY 互斥

O_CREAT

如果要開啟的檔案不存在,則建立該檔案

O_EXCL

該標誌與 O_CREAT 共同使用時,會去檢查檔案是否存在,若檔案不存在則建立該檔案,否則將導致開啟檔案失敗。此外,開啟檔案連結時,使用該標誌將導致失敗

O_NOCTTY

如果要開啟的檔案為終端裝置,則不把該終端裝置當成控制終端

O_TRUNC

若檔案存在且以可寫方式開啟,此標誌會清除檔案內容,並將其長度置為 0

O_APPEND

讀寫檔案都從檔案的尾部開始,所寫入的資料會以追加的方式插入到檔案末尾

O_NONBLOCK

以不可阻塞方式開啟檔案,也就是不管有無資料需要讀寫或者等待,都會立即返回

O_NDELAY

以不可阻塞方式開啟檔案,也就是不管有無資料需要讀寫或者等待,都會立即返回(已過時,由 O_NONBLOCK 替代)

O_SYNC

以同步方式開啟檔案

O_NOFOLLOW

如果檔名所指向的檔案本身為符號連結,則會導致開啟檔案失敗

O_DIRECTORY

如果檔名所指向的檔案本身並非目錄,則會導致開啟檔案失敗

 write();

1) 函式原型 ssize_t write(int fd, const void *buf, size_t count);

2) 輸入引數 fd,檔案描述符;

         *buf,要寫入的資料緩衝區指標;

         count,要寫入資料的大小(位元組);

3)  ssize,實際成功寫入多少個位元組的資料,寫入失敗返回-1

4)      char write_buf [] = “hello linux”;   res = write(fd, write_buf, sizeof(write_buf));

 

 read();

1) 函式原型 ssize_t read(int fd, void *buf, size_t count);

2) 輸入引數 fd,檔案描述符;

         *buf,儲存讀取資料的資料緩衝器指標;

         count,要讀取多少個位元組的資料;

3)  ssize,實際讀取到資料的位元組數,讀取失敗返回-1

4)      char read_buf[100] = {0}; res = read(fd, read_buf, data_size);

lseek();

1) 函式原型 off_t lseek(int fd, off_t offset, int whence);

2) 輸入引數 fd,檔案描述符;

         offset,以whence為基準的偏移值;

         whence,基準,取值為SEEK_SETSEEK_CURSEEK_END

3)  返回新的讀寫位置(相對於檔案開頭)。

4)      new_offset = lseek(fd, offset, SEEK_END)

5)      這個函式只能在支援隨機讀取的檔案中使用,使用了該函式後再進行 讀寫操作就會從新的讀寫位置開始讀寫。也可以用lseek(fd, 0, SEEK_END)獲取檔案大小;

close();

1) 函式原型 int close(int fd);

2) 輸入引數 fd,檔案描述符;

3)  int,成功關閉返回0,失敗則返回-1

4)      close(fd);

ioctl();

1) 函式原型 int ioctl(int fd, int cmd, );

2) 輸入引數 fd,檔案描述符;

       cmd,操作命令,一般不同的檔案cmd也不同;

3)  int,操作成功返回0,失敗返回-1

4)      cmd = 0;  ioctl(fd, cmd);

5)      ioctl是一個雜項函式,一些檔案操作不適用writeread進行操作, 就用ioctl完成操作,例如開啟開發板的某個IO裝置檔案,進行IO 控制的時候,writeread顯得不是很合適。

 fsync();

1) 函式原型 int fsync(int fd);

2) 輸入引數 fd,檔案描述符;

3)  int,成功返回0,失敗返回-1

4)      fsync(fd);

5)      執行完write()函式的時候,實際上資料是寫到了系統快取區,還沒有 寫到檔案中,需要執行fsync()函式進行同步,將系統快取區的資料寫 入到檔案中。

綜合例項:

   

 

交叉編譯後,通過NFS將可執行檔案傳送到開發板上執行,輸出結果為: