嵌入式之系統IO編程綜述

linux 系統中,文件IO的流程
在這裏插入圖片描述
文件IO有5個函數:open() read(),write(),close(),leek()。
write()函數編寫,它等同printf()函數,但是引用的更爲直接,它直接寫到內核裏面
是unsitd.h頭文件裏面包含
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
1、open-打開或者創建一個文件
open(char *, flag, mode)在fcntl.h文件中聲明,函數的作用:創建或這打開文件
參數:最多三個參數
char * 包含有文件名和路徑
flag 打開文件的方式
mode 創建文件的權限

flag 功能
O_RDONLY 只讀
O_WRONLY 只寫
O_RDWR 讀寫
O_CREAT 創建一個文件
O_EXCL 檢測文件是否存在
O_TRUNC 打開文件覆蓋
O_APPEND 打開文件追加

編寫一個open()函數,
在這裏插入圖片描述
open(傳入的值,創建一個文件夾 | 具有讀寫權限 , 權限命令爲777)
運行結果爲
在這裏插入圖片描述
創建文件的權限:mode &(~umask)它是權限命令碼和掩碼的與得出的結果
返回值

成功 出錯
文件表述符 文件的ID號 返回-1

使用追加命令O_APPEND
在這裏插入圖片描述

在這裏插入圖片描述

編譯後 將內容添加到b.c文件中,使用echo命令
echo 添加內容到 > 指定文件
運行文件./append
運行成功
write()函數-寫一個數據到文件
write(int fd, void *buf, size_t count);在fcntl.h庫文件中聲明

參數 描述
int fd 當前文件的innode輸入,就是寫到哪個文件
void *buf 寫的內容buf
sizeof_t 寫多少個字節sizeof_t

返回值:實際讀的字節數
例子
在這裏插入圖片描述
這裏向b.c文件寫入一個hello linux 字符串
在這裏插入圖片描述
編譯運行
在這裏插入圖片描述
通過查看可以得到b.c文件裏面的內容
read()函數和write()函數相同
在這裏插入圖片描述
在這裏插入圖片描述
編譯運行結果,在這裏read_buf讀不出數據是因爲在同一個文件中,寫數據的時候指針已經往下移動,沒有重新返回,所以讀取的時候讀到後面的數據,後面的數據爲空

lseek()函數
所以我們這裏引用到leek()函數 -讀取一個文件的位置指針
lseek(int fd, off_t offste,int whence); 在sys/types.h unistd.h庫中聲明
作用:調整讀寫的位置指針

參數 描述
int fd 當前文件,寫到那個文件
off_t offset 偏移量,每讀寫操作所移動的距離,單位是字節的數量,可正負,(正前移負後移)
int whence 當前位置的基點,有三個標誌: 1、SEEK_SET(文件的開頭)2、SEEK_CUR(文件指針的當前位置)3、SEEK_END(文件的結尾)

返回值:成功則返回文件指針的當前位置
錯誤則返回-1;
例子:
在這裏插入圖片描述
這裏lseek(哪個文件,從哪裏開始,文件起始命令);
在這裏插入圖片描述
第二位正數是向前移動2位,負爲後移

CP命令函數的實現
轉載自https://blog.csdn.net/QiHsMing/article/details/87888556
這裏把前面介紹的文件 I/O 操作綜合起來,成爲一個完整的文件操作範例。在這個範例 中,先以可寫方式打開當前目錄下的“hello.txt”文件,如果該文件不存在,則創建文件, 再往文件中寫入一個字符串“Hello, welcome to linux world!”,把操作結果輸出到終端後, 關閉文件。接着再次以只讀模式打開該文件,讀取剛纔寫入的數據,並把結果輸出到終端, 最後關閉該文件。
創建 file_wr 目錄,打開文本編輯器,輸入如程序清單 11.8 所示的代碼,命名爲 file_wr.c 並保存到 file_wr 目錄。

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
 #include <errno.h>
 int main(int argc, char* argv[]) 
 { 
   	char sz_str[] = "Hello, welcome to linux world!"; 
	char sz_filename[] = "hello.txt"; 
	int fd = -1;
	int res = 0;
	char buf[128] = {0};
	fd = open(sz_filename, O_WRONLY | O_CREAT,  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);  /* 以只寫、創建打開文件  權限模式 mode=0x664 */
	if(fd < 0)
		{ 
		printf("open file \"%s\" failed, errno=%d.\n",  sz_filename, errno); 
		 return -1; 
		 } 
		  res = write(fd, sz_str, sizeof(sz_str));       /* 寫文件 */
		  printf("write %d bytes to \"%s\".\n", res, sz_filename);   
		  fsync(fd);            /* 同步文件 */ 
		 close(fd);            /* 關閉文件 */ 
		
		fd = open(sz_filename, O_RDONLY);       /* 從只讀方式打開文件 */ 
		if(fd < 0)
		{  
			 printf("open file \"%s\" failed,errno=%d.\n",sz_filename, errno);
			 return -1;
		} 
		 res = read(fd, buf, sizeof(buf));        /* 讀文件 */ 
		 buf[res]='\0'; 36  printf("read %d bytes from file \"%s\", data=\"%s\"\n",  res, sz_filename, buf); 
		close(fd);
		 return 0; 
 } 

給 file_wr.c 製作一個 Makefile,用 make 命令來編譯。回顧一下 10.2 節關於 Makefile 的內容,把那裏介紹的 Makefile 範例複製到 file_wr 目錄,修改 Makefile 文件前 3 個變量並 保存,改好後的 Makefile 如
在這裏插入圖片描述
在這裏插入圖片描述
進入 file_wr 目錄,輸入 make 命令,完成編譯,運行程序,結果如圖 所示
在這裏插入圖片描述

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