跟著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) 返 回 值
4) 示 例 : fd = create(“hello.txt”, 0x644);
open();
1) 函式原型 : int open(const char *pathname, int flags, ... /* mode_t mode */);
2) 函式輸入 : *pathname,檔案全名(可帶路徑);
flags,開啟選項,包括讀寫方式,是否建立等等;
mode,使用者讀寫模式,可以與chmod所用引數一樣;
3) 返
4) 示 例 : fd = open(“hello.txt”, O_RDWR|O_CREAT, 0X644);
注意:只有在flags引數中輸出了O_CREAT,mode引數才有效,否則就算沒有hello.txt也不會建立,0x644也就失去了作用。flags主要取值如下:
引數名 |
開啟檔案標誌 |
描述 |
flags |
O_RDONLY |
以只讀方式開啟檔案,與 O_WRONLY |
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_SET、SEEK_CUR、SEEK_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是一個雜項函式,一些檔案操作不適用write和read進行操作, 就用ioctl完成操作,例如開啟開發板的某個IO裝置檔案,進行IO 控制的時候,write和read顯得不是很合適。
fsync();
1) 函式原型 : int fsync(int fd);
2) 輸入引數 : fd,檔案描述符;
3) 返 回 值 : int,成功返回0,失敗返回-1;
4) 示 例 : fsync(fd);
5) 說 明 : 執行完write()函式的時候,實際上資料是寫到了系統快取區,還沒有 寫到檔案中,需要執行fsync()函式進行同步,將系統快取區的資料寫 入到檔案中。
綜合例項:
交叉編譯後,通過NFS將可執行檔案傳送到開發板上執行,輸出結果為: