文件系统调用示例
本程序可通過以下命令行方式運行
 假設aaa,bbb是兩個文本文件
把文件aaa內容復制到bbb,如果bbb已經存在,aaa就會覆蓋它,否則,就創建它,程序調用必須提供兩個參數:第一個是輸入文件,第二個是輸出文件.
具體代碼如下:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <fcntl.h> //fcntl.h是unix標準中通用的頭文件,其中包含的相關函數有open,fcntl,shutdown,unlink,fclose等 #include <unistd.h> //是C和C++程序設計語言中提供對POSIX操作系統API的訪問功能的頭文件的名稱#define BUF_SIZE 4096 #define OUTPUT_MODE 0700 int main(int argc,char *argv[]) {int in_fd,out_fd,rd_count,wt_count;char buffer[BUF_SIZE];if(argc!=3)exit(1);in_fd = open(argv[1],O_RDONLY);//O_RDONLY 以只讀方式打開文件if(in_fd<0)exit(2);out_fd = creat(argv[2],OUTPUT_MODE);if(out_fd<0)exit(3);while(1){rd_count = read(in_fd,buffer,BUF_SIZE);if(rd_count<=0)break;wt_count = write(out_fd,buffer,rd_count);if(wt_count <= 0)exit(4);}close(in_fd);close(out_fd);if(rd_count == 0)exit(0);elseexit(5);return 0; }//D:\Ccode\OS-讀寫文件\bin\Debug\OS-讀寫文件.exe D:\aaa.txt D:\bbb.txtint main(int argc,char *argv[])
 main有兩個參數,第一個表示調用該程序時命令行中包含多少個字符串,包括該程序名argv[]應該包含指向下列值的指針:
在Codeblocks中調試時我們先選擇Project,然后選擇Project-Set Program’s Arguments,再按照下圖設置
 
 在此之前我們可以現在D盤下創建aaa,bbb兩個文件
 aaa中輸入hello,bbb文件為空,運行程序后,會發現bbb文件內容與aaa內容相同.
我們來看一下具體程序
首先聲明了五個變量,(1)in_fd和out_fd用來保存文件描述符,即打開一個文件時返回的一個小整數,(2)rd_count和wt_count分別是由read和write系統調用所返回的字節數,(3)最后一個buffer是用來保存讀出的數據以及提供寫入數據的緩沖區.
- 接著我們試圖打開源文件并創建目標文件。如果源文件成功打開,系統會給in_fd賦予一個小的整數,用以標識源文件。后續的調用必須引用這個整數,使系統知道需要的是哪一個文件。類似地,如果目標文件也成功地創建了,out_fd會被賦予一個標識用的值。creat的第二個變量是設置保護模式。如果打開或創建文件失敗,對應的文件描述符被設為-1,程序帶著錯誤碼退出。
 - 接下來是用來復制文件的循環。 一 開始試圖讀出4KB數據到buffer中。它通過調用庫過程read來完成這項工作,該過程實際激活了read系統調用。第一個參數標識文件,第二個參數指定緩沖區,第三個參數指定讀出多少字節。賦予rd_count的字節數是實際所讀出的字節數。通常這個數是4096,除非剩余字節數比這個數少。當到達文件尾部時,該參數的值是0。如果rd_count是零或負數,復制工作就不能再進行下去,所以執行break語句,用以中斷循環(否則就無法結束了)。
 - 調用write把緩沖區的內容輸出到目標文件中去。同read類似,第一個參數標識文件,第二個參數指定緩沖區,.第三個參數指定寫入多少字節。注意字節計數是實際讀出的字節數,不是buf_ size。這一點是很重要的,因為最后一個緩沖區中的數據大小一般不會是4096,除非文件長度碰巧是4KB的倍數。
 - 當整個文件處理完時,超出文件尾部的首次調用會把0值返回給rd_count,這樣,程序會退出循環。
 - 此時,關閉兩個文件,程序退出并附有正常完成的狀態碼。
 
Linux-文件操作
本文介紹文件的通用操作方法.先介紹如何建立文件,打開文件,讀取和寫入數據.
 文件描述符
 Linux下用文件描述符來表示設備文件和普通文件.文件描述符是一種整型的數據,所有對文件的操作東通過文件描述符實現.
 文件描述符是連接用戶空間和內核空間的樞紐.當打開一個或者創建一個文件時,內核空間創建相應的結構,并生成一個整型的變量傳遞給用戶空間的對應進程.進程用這個文件 描述符來對文件進行操作.用戶空間的操作,例如讀寫一個文件時,將文件描述符作為參數傳送給read或write.讀寫函數的系統調用到達內核時,內核解析文件描述符的整型變量,找出對應的設備文件相應的函數,并返回用戶空間的結果.
 文件描述符的范圍是0-OPEN_MAX,因此是一個有限的資源,在使用完畢后用要及時釋放,通常是調用close()函數關閉.文件描述符的值僅在同一個進程中有效.
 在Linux系統中有3個已經分配的文件描述符,即標準輸入,標準輸出和標準錯誤,它們文件描述符的值分別為0,1,2.
打開創建文件open() create()函數
 函數原型如下
關閉文件close()函數
總結
                            
                        - 上一篇: Hadoop2.0新特性
 - 下一篇: 数据仓库Hive