1. 程式人生 > >Linux系統呼叫IO

Linux系統呼叫IO

Linux 系統呼叫IO 開啟檔案: int open(const char* pathname,int flags); int open(const char *pathname,int flags,mode_t mode); 引數一:檔案路徑 引數二:開啟許可權 三選一: O_RDONLY, 只讀 O_WRONLY, 只寫 O_RDWR 讀寫 可選可不選: O_CREAT, 如果不存在則建立 O_EXCL,如果O_CREAT也被設定,此指令會檢查檔案是否存在。不存在則建立,否則開啟錯誤 若O_CREAT與O_EXCL同時設定,並且預開啟的檔案為符號連線,則會開啟檔案失敗 > 符號連線也稱為軟連線 詳解見https://blog.csdn.net/KaiLoveM/article/details/79169080 O_NOCTTY,如果欲開啟的檔案問終端機裝置時,則不會將該終端機當成程序控制終端機。 O_TRUNC:把檔案的長度變為0,相當於清空檔案,必須要有寫的許可權(O_WRONLY或O_RDWR) O_APPEND,以附加方式加入到檔案後面 O_NOFOLLOW 如果引數pathname所指的檔案為一符號連線,則會令檔案開啟失敗 O_DIRECTORY 如果所指的檔案並非為一個目錄,則會令檔案開啟失敗 引數三:若建立檔案給予的許可權,八進位制數 rwx :讀1,寫2,執行4 相加 格式:特殊許可權 user許可權 group許可權 other許可權 如 : 0 7 7 7 全部人都是可讀可寫可執行 返回值: 成功:檔案描述符fd 注:使用者申請檔案描述符從3開始, 0 - 2系統佔用(0標準輸入stdin,1標準輸出stdout,2標準出錯stderr) 失敗:-1

讀檔案 ssize_t read(int fd,void* buf,size_t count) 引數一: int ----- open的返回值 引數二: void * ---- 用來存放讀取資料的記憶體的首地址 引數三:size_t 讀取內容大小,單位:位元組 返回值: 成功:>0 讀取的位元組數 =0 檔案末尾 失敗:-1

寫檔案 ssize_t write(int fd, const void *buf, size_t count) 引數一:open的返回值 引數二: 要寫入資料的記憶體的首地址 引數三: 寫入內容大小,單位:位元組 返回值: 成功:>0 寫入的位元組數 =0 檔案末尾 失敗:-1

關閉檔案 close(int fildes) 引數:open返回值,檔案描述符 返回值 成功:0 失敗:-1

練習:使用系統呼叫IO實現檔案的拷貝

int main()
{
	int readfd, writefd;
	readfd = open("./file.c", O_RDONLY);//只讀開啟原檔案
	if(readfd == -1)
	{
		printf("open file fail\n");
	}else
	{
		printf("open file success\n");
	}
	
	writefd = open("./newfile.c", O_RDONLY | O_CREAT);//建立新檔案
	if(readfd == -1)
	{
		printf("open newfile fail\n");
	}else
	{
		printf("open newfile success\n");
	}

	int size = 0;
	char buf[20] = {0}
	while(size = read(readfd, buf, 15) )//讀到檔案末尾結束迴圈
	{
		write(writefd, buf, size);
		bzero(buf, 20);//陣列清零
	}
	return 0;
}