1. 程式人生 > >利用read/write系統呼叫複製檔案

利用read/write系統呼叫複製檔案

//copy_system.c

 //NOTE: unistd.h header file should be included at first
// for other header files  would depend on it
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

//for files
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define  STD_FILE_INPUT		0
#define  STD_FILE_OUTPUT	1
#define  STD_FILE_ERROR		2

#define  EACH_UNIT 128

int main(int argc, char* argv[]){

	const char *src_file = "./draft1.txt";
	const char *dest_file = "./draft2.txt";

	//open two files
	int fd_src = open(src_file, O_RDONLY);
	if(fd_src == -1){
		char err[128];
		sprintf(err, "open src file failed, errno = %d \n", errno);
		write(STD_FILE_OUTPUT, err, strlen(err)+1);
		return -1;
	}

	int fd_dest = open(dest_file, O_WRONLY | O_CREAT,  S_IWUSR | S_IRUSR);

	if(fd_dest == -1){

		char err[128];
		sprintf(err, "open [O_WRONLY] dest file failed, errno = %d \n", errno);
		write(STD_FILE_OUTPUT, err, strlen(err)+1);
		

		fd_dest = open(dest_file, O_CREAT, S_IWUSR | S_IRUSR);

		if(fd_dest == -1) {
			char err[128];
			sprintf(err," create [ S_IWUSR | S_IRUSR]  dest file failed, errno = %d \n", errno);
			write(STD_FILE_OUTPUT, err, strlen(err)+1);
			close(fd_src);
			return -1;
		}

	}

	int nread = 1;

	while(nread){

		
		char c ; 
		//nread = read(fd_src, &c, sizeof(c));


		char data[EACH_UNIT] = {0};
		nread = read(fd_src, &data, sizeof(data));

		if(-1 != nread){

			//fd_src+=nread;
			printf("[while] - nread :%d \n", nread );

			//檔案控制代碼自己追加,不需要開發者移位
			//int nwrite = write(fd_dest, &c, nread); 
			int nwrite = write(fd_dest, &data, nread); 

			printf("[while] - nwrite :%d \n", nwrite );

			if(nwrite == -1){

				const char * err_msg_write = "write error\n";
				write(STD_FILE_OUTPUT, err_msg_write, sizeof(err_msg_write)/ sizeof(err_msg_write[0]));

				close(fd_dest);
				close(fd_src);

				return -2;
			}
			
			//fd_dest+=nwrite;
			

		}else{

			const char * err_msg_read = "read error\n";
			write(STD_FILE_OUTPUT, err_msg_read, sizeof(err_msg_read)/ sizeof(err_msg_read[0]));

			close(fd_dest);
			close(fd_src);

			return -3;
		}
	}//while

	//close both file handles
	close(fd_dest);
	close(fd_src);

	return 0;
}


/*
測試花費時間

[
[email protected]
file-system]$ TIMEFORMAT="" time ./test-copy-system [while] - nread :128 [while] - nwrite :128 [while] - nread :14 [while] - nwrite :14 [while] - nread :0 [while] - nwrite :0 0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 432maxresident)k 0inputs+0outputs (0major+141minor)pagefaults 0swaps */


相關推薦

利用read/write系統呼叫複製檔案

//copy_system.c //NOTE: unistd.h header file should be included at first // for other header files would depend on it #include <unis

linux中的readwrite系統呼叫

linux中read和write系統呼叫 在這裡小koala著重於read()和write()來讀寫普通檔案,因為小koala在編寫實際檔案讀寫函式時,疏忽了一些重要的地方,造成無休止的向系統中寫資料,最後系統崩潰。當時瞬間“三觀”盡毀。現在較為詳細地分析錯誤

Linux檔案系統學習(四)之read open系統呼叫

open的執行過程:v2.6.30  Open Sys_open |do_sys_open() |get_unused_fd_flags ()//得到一個可用的檔案描述符;通過該函式,可知檔案描述符                                      

再探Linux核心write系統呼叫操作的原子性

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

系統呼叫方式檔案程式設計

1.核心理論 檔案描述符:         在linux系統中,所有開啟的檔案對應一個數字,這個數字由系統來分配,我們稱之為:檔案描述符。 2.函式學習 開啟檔案 函式名:    open 函式原型:int open

Linux下系統呼叫實現檔案操作

系統呼叫(系統呼叫是作業系統提供給使用者程式的一組“特殊”函式介面,使用者通過這組介面獲得作業系統提供的服務)中操作I/O的函式,都是針對檔案描述符的。 通過檔案描述符可以直接對相應檔案進行操作,如:open、close、write、read、ioctl #define STDIN_FIL

Linux系統呼叫檔案函式

先說明可用的檔案I/O函式——開啟檔案,讀檔案,寫檔案等。 但是在Linux中大多數檔案I/O只需要用到5個函式:open、read、write、lseek及close。 一、open函式 呼叫open函式可以開啟或建立一個檔案。 返回值:若成功則返回檔案描述符,若出錯則返回-

Linux系統呼叫檔案描述符

每個執行的中的程式被稱為程序,他有一些與之關聯的檔案描述符。 檔案描述符就相當於Windows中的File * 指標,標記著檔案資訊,然而我們可以知道檔案描述符為一個非負整數,怎麼用一個非負整數描述一個檔案呢。 在作業系統中,每一個程序都有標記自己的程序控制塊(PCB)。 在PCB中,就

Select()系統呼叫檔案描述符集fd_set的應用

過去,描述符集被作為一個整數位遮蔽碼得到實現,但是這種實現對於多於32個的檔案描述符將無法工作。描述符集現在通常用整數陣列中的位域表示,陣列元素的每一位對應一個檔案描述符。例如,一個整數佔32位,那麼整數陣列的第一個元素代表檔案描述符0到31,陣列的第二個元素代表檔案描述符32到63,以此類推。巨集FD_SE

linux系統呼叫 建立檔案 file_creat.c

 void creat_file(char * filename) {     if(creat(filename,0755)<0)      {        printf("create file %s failure!\n",filename);        exit(EXIT_FAILURE

select()系統呼叫檔案描述符集fd_set 轉

過去,描述符集被作為一個整數位遮蔽碼得到實現,但是這種實現對於多於32個的檔案描述符將無法工作。描述符集現在通常用整數陣列中的位域表示,陣列元素的每一位對應一個檔案描述符。例如,一個整數佔32位,那麼整數陣列的第一個元素代表檔案描述符0到31,陣列的第二個元素代表檔案描述符32到63,以此類推。巨集FD_SE

LS8-linux系統呼叫方式檔案程式設計之學習筆記

linux系統呼叫方式檔案程式設計 定義/功能:檔案描述符 在Linux系統中,所有開啟的檔案對應一個數字,這個數字由系統分配,稱之為:檔案描述符。(可類似理解為:省份證號與你本人的關係),通過檔案描述符便可以對檔案進行操作。 開啟檔案 1.1 函式名

Linux VFS中write系統呼叫實現原理

目錄 WORD裡面的目錄複製過來似乎不能直接用。。還是放在這裡當主線看吧.. 使用者空間的write函式在核心裡面的服務例程為sys_write [email protected]

四種讀寫檔案的方式:系統呼叫(open/read/write),C語言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型演算法

第一種方法是系統呼叫 (1)open系統呼叫    原型:        #include <sys/types.h>        #include <sys/stat.h>        #include <fcntl.h>     

open/read/write/close等檔案系統呼叫介面以及fd與FILE的比較

在Linux系統下,檔案是一個很重要的概念,接下來就介紹一下其相關的介面函式 一、熟悉open/read/write/close等檔案相關係統呼叫介面 1、open函式 註釋: (1)函式說明:用來開啟一個已經存在的檔案或者建立一個普通檔案 (

Linux下的C語言程式設計——系統呼叫readwrite函式實現檔案拷貝

 系統呼叫read和write函式實現檔案拷貝 #include <stdio.h> #include <sys/types.h> #include <sys/st

組合語言呼叫Linux系統呼叫readwrite

.section .data UserMsg: .ascii "Please input the message:" LenOfUserMsg: .equ lenMsg, LenOfUserMsg - UserMsg #.section .bss # .lcomm r

linux系統呼叫open、write、close、read以及stat函式詳解

學習筆記 參考連結1 、參考連結2以及百度百科 在進行C語言學習的時候我們瞭解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函式,他們都是由C庫函式提供的一些函式,是將作業系

系統呼叫——open、writeread和close

一、檔案描述符 每一個程序都有一個與之相關的檔案描述符,它們是一些小值整數,我們可以通過這些檔案描述符來訪問開啟的檔案。 一般地,一個程式開始執行時,會自動開啟3個檔案描述符: 0——–標準輸入———-stdin 1——–標準輸出———-stdout

系統呼叫write、open、read

一、open      簡單來說,open建立了一條到檔案或裝置的訪問路徑。如果呼叫成功,它則返回一個可以被read、write和其他系統呼叫使用的檔案描述符。這個檔案描述符是惟一的,它不會與其他任何執行中的程序共享,如果兩個程式同時開啟同一個檔案,他們會分別得到兩個不同的