Linux 下目錄是/這樣的 而windows是怎麼記呢?和w是不是一樣的反向?所以Linux的目錄就是反的反向,好記了。
一:open函數
名稱:open
目標:開啟一個檔案。
標頭檔:#include
#include
#include < fcntl.h>
函數原形:int open(const char * pathname,int flags);
int open(const char * pathname,int flags,mode_t mode);
參數: pathname 檔案名稱
flags 開啟模式
傳回值:-1 遇到錯誤
int 開啟成功,返迴文件描述符。
這個系統調用在進程和檔案之間建立一條串連,這個串連被稱為檔案描述符,它就像一條由進程通向核心的管道。
要開啟一個檔案,必須指定檔案名稱和開啟模式,有3種開啟模式:唯讀,唯寫,可讀可寫,分別對應於O_RDONLY,O_WRONLY,O_RDWR,這在標頭檔/usr/include/fcntl.h中有定義。
開啟檔案是核心提供的服務,如果在開啟過程中核心檢測到任何錯誤,這個系統調用就會返回-1。錯誤的類型是各種各樣的,如:要開啟的檔案不存在。即使檔案存在可能因為許可權不夠而無法開啟,在open的線上說明中列出了各種可能的錯誤,大家可以看看。
UNIX允許一個檔案被多個進程訪問,也就是說當一個檔案被一個進程開啟後,這個檔案還可以被其它進程開啟。
如果檔案被順利開啟核心會返回一個正整數的值,這個數值就叫檔案描述符,檔案描述符是是一個簡單的整數,用以標明每一個被進程所開啟的檔案,描述符0代表標準輸出,對應的宏是 STDOUT_FILENO,描述符1代表標準輸入,對應的宏為STDIN_FILENO,描述符2代表標準錯誤輸出,對應的宏為STDERR_FILENO,系統給進程分配描述符都是從3開始的,如果同時開啟好幾個檔案,它們所對應的的檔案描述符是不同的,如果一個檔案開啟多次,對應的檔案描述符也不相同。必須通過檔案描述符對檔案操作。下面的程式可以證明這一點。
二:read函數
名稱:read
目標:把資料讀到緩衝區。
標頭檔:#include < unistd.h>
函數原形:ssize_t read(int fd, void *buf, size_t count)
參數: fd 檔案描述符
buf 用來存放資料的目的緩衝區
count 要讀取的位元組數
傳回值:-1 遇到錯誤
numread 成功關閉,返回所讀取的位元組數目。
read這個系統調用請求核心從fd所指定的檔案中讀取qty位元組的資料,存放到buf所指定的記憶體空間中,核心如果成功地讀取了資料,就返回所讀取的位元組數目。否則返回-1。
當檔案的位元組數沒有你想要的那麼多時,read就會判斷下一個數值是不是’’,如果是就停止讀取,然後退出。numread返回的是’’之前的位元組數,也就是是原檔案的位元組數而不是你想讀的位元組數。
三:close函數
名稱:close
目標:關閉一個檔案。
標頭檔:#include < unistd.h>
函數原形:int close(int fd)
參數: fd 檔案描述符
傳回值:-1 遇到錯誤
int 關閉成功,返迴文件描述符。
Close這個系統調用會關閉進程和檔案fd之間的串連,如果關閉過程中出現錯誤,close返回-1,如:fd所指的檔案並不存在。關閉成功則返迴文件描述符。
代碼: 一個基本的開啟檔案,讀取,並關閉的例子
#include
#include
#include
#include
#include
#include
main()
{
int fd,size;
char s [ ]="Linux Programmer!n",buffer[1024];
fd=open("show_read.c",O_RDONLY);
size=read(fd,buffer,sizeof(buffer));
close(fd);
printf("%s",buffer);
}
四:craet函數
名稱:creat
目標:建立/重寫一個檔案
標頭檔:#include
#include
#include < fcntl.h>
函數原形:int creat(const char *pathname,mode_t mode)
參數: pathname 檔案名稱
mode 訪問模式
傳回值:-1 遇到錯誤
fd 建立成功,返迴文件描述符
Creat告訴核心建立一個名為filename的檔案,如果這個檔案不存在,就建立它,如果已經存在,就把它的內容清空,把檔案的長度設為0。
如果核心成功地建立了檔案,那麼檔案的許可位(permission bits)被設定為由第二個參數mode所指定的值.如:
fd=creat(“addressbook”,0644);
建立一個名為addressbook的檔案,如果檔案不存在,那麼檔案的許可位被設為 rw-r-r—.
如果檔案已存在它的內容會被清空。任一情況下,fd都會是指向addressbook的檔案描述符。
五:write函數
名稱:write
目標: 將記憶體中的資料寫入檔案。
標頭檔:#include < unistd.h>
函數原形:size_t write(int fd, const void *buf, size_t count)
參數: fd 檔案描述符
buf 記憶體資料
count 要寫的位元組數
傳回值: -1 遇到錯誤
Num written 成功寫入,返回寫入的位元組數目。
在實際的寫入過程中,可能會出現寫入的位元組數少於所要求的。這可能有兩個原因,第一是有的系統對檔案的最大尺寸有限制,第二是磁碟空間接近滿了。在上述兩種情況下核心都會儘力把資料往檔案中寫,並將實際寫入的位元組數返回,所以調用write後都必須檢查傳回值是否與要寫入的相同,如果不同就要採取相應的措施。
學完上面幾個系統調用,我們就可以自己編寫的cp命令了。它的基本思路是從原檔案讀取資料寫入緩衝,再將緩衝的資料寫入目標檔案。
代碼:建立一個檔案並寫入內容
#include
#include
#include
#include
#include
#include
main()
{
int fd,size;
char s [ ]="Linux Programmer!n",buffer[1024];
char filename[]="newfile.txt";
fd=creat(filename,0644);
fd=open(filename,O_WRONLY|O_CREAT);
write(fd,s,sizeof(buffer));
fd=open(filename,O_RDONLY);
size=read(fd,buffer,sizeof(buffer));
close(fd);
printf("%s",buffer);
}