第三章:文件系統
比較重要的設備文件有三個,它們是/dev/console,/dev/tty和/dev/null
1,/dev/console設備:系統控制檯,出錯和診斷信息通常會被髮送到這個設備。
2,/dev/tty設備:進程控制終端的一個假名。
3,/dev/null:空設備,所以寫向這個設備的輸出都將被丟棄。而讀這個設備會立刻返回一個文件尾標誌。
常用訪問文件的函數:
open:
read:
write:
close:
ioctl:把控制信息傳遞到設備驅動程序。
文件描述符:
0:標準輸入;
1:標準輸出;
2:標準錯誤;
open系統調用:
建立一條到文件或者設備的訪問路徑,如果操作成功,它將返回一個文件描述符,後續的read,write等系統調用就將使用該文件描述符對打開的那個文件進行操作。
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int open (const char *path,int oflags);
int open (const char *path,int oflags,mode_t mode);
oflags參數是通過把要求的文件訪問模式與其它可選模式按位or得到的。
文件訪問模式:O_RDONLY(只讀)O_WRONLY(只寫)O_RDWR(讀寫)
其它可選模式:
O_APPEND(把寫入的數據追加在文件的末尾)
O_TRUNC(把文件的長度設置爲0,丟棄其中現有的內容)
O_CREAT(按mode中給出的模式創建文件)
O_EXCL(與o_creat一起使用,如果文件存在,open操作失敗)
mode參數:
S_IRUSR:讀權限,文件屬主
S_IWUSR:寫
S_IXUSR:執行權限,文件屬主
S_IRGRP:讀
S_IWGRP:寫
S_IXGRP:執行權限,文件所在分組
S_IROTH:讀
S_IWOTH:寫
S_IXOTH:執行權限,其它用戶
如:
open ("myfile", O_CREAT, S_IRUSR | S_IXOHT);
創建一個名爲myfile的文件,文件的屬主擁有它的讀操作權限,其它用戶只能執行。Mode會受umask決定。(chmod umask myfile)
close系統調用:
終止一個文件描述符fildes與它文件之間的關聯。
#inlcude<unistd.h>
int close (int fildes);
write系統調用:
把緩衝區BUF裏的前nbytes個字節寫入與文件描敘符fildes相關聯的文件中去。
#include <unistd.h>
size_t write(int fildes,const void *buf ,size_t nbytes);
read系統調用:
與文件描敘符fildes相關聯的文件中的讀入前nbytes個數據讀,並把它們放到字節緩衝區BUF。它的返回值是實際讀入的字節數,它可能會小於nbytes的值。
#include <unistd.h>
size_t read(int fildes,const void *buf ,size_t nbytes);
ioctl系統調用:
提供一個對設備行爲,設備描述符,設備底層服務的配置工作等方面進行控制的操作界面。
#include <unistd.h>
int ioctl(int fildes,int cmd, ... );
lseek,fstat,stat,lstat系統調用,先跳過;
標準IO庫:
fopen函數:
#include <stdio.h>
FILE *fopen(const char *filename,const char *mode);
打開模式有:
"r" "rb" 只讀方式打開
"w" "wb" 以寫方式打開,並把文件長度截短爲零
"a" "ab" 以寫方式打開,新內容追加在文件尾
"r+" "rb+" "r+b" 以修改方式打開,(讀寫)
"w+" "wb+" "w+b" 以修改方式打開,並把文件長度截短爲零
"a+" "ab+" "a+b" 以修改方式打開,新內容追加在文件尾
字母“b”表示文件是一個二進制文件。UNIX把所以文件都看成是二進制文件。
mode參數是一個字符串,所以要使用“r”,而不是‘r’。
fread 函數:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
從文件流stream讀數據到ptr指定的數據緩存區裏。它的返回值是成功地讀到數據緩存區裏的記錄個數,而不是字節數。
fwrite函數:
size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);
從指定數據緩存取數據寫到輸出流去。
fclose函數:
int fclose (FILE *stream);
關閉指定的文件流stream,使所以尚未寫出的數據都寫到文件裏去。
fflush函數:
#include <stdio.h>
int fflush(FILE *stream);
把文件流裏的現有數據立刻寫入文件。
fseek函數:
int fseek(FILE *stream, long int offset, int whence);
爲下一次讀寫操作設置偏移位置。
fgetc,getc,getchar函數:
#include <stdio.h>
int fgetc(FILE *stream); 從文件流裏取出下一個字節並把它當做一個字符返回。當它達到文件尾或出現錯誤時,返回EOF。
int getc (FILE *stream); 作用相當於fgetc,但我們可以在stream參數不允許有副作用的情況下把getc實現爲一個宏。
int getchar(); 相當getc(stdin),
fputc,putc,putchar函數:
int fputc(int c, FILE *stream); 把一個字符寫到輸出文件流裏,返回值爲剛寫的那個值,失敗返回EOF。
int putc(int c, FILE *stream); 相當於fputc,但可以實現爲一個宏。
int putchar(int c); 相當putc(stdout);
fgets,gets函數:
char* fgets(char *s,int n, FILE *stream);從輸入文件流讀取n-1個字符加上"/0"寫到s指向的字符串去。
char* gets(char *s);對傳輸的字符個數沒限制,避免使用!
printf ,scanf 等跳過。
chmod,chown 略。
unlink,link ,symlink系統調用:
#include <unistd.h>
int unlink (const char *path);
int link(const char *path1, const char *path2);
int symlink(const char *path1, const char *path2);
mkdir,rmdir系統調用:
#include <sys/stat.h>
int mkdir (const char *path, mode_t mode);
int rmdir (const char *path);
chdir,getcwd系統調用:
#include <unistd.h>
int chdir(const char *path);改變工作目錄。
int *getcwd(char *buf,sizo_t size);把當前子目錄的名字寫到給定的BUF裏。
-------------------------------------------------------------------------
掃描子目錄函數:
與子目錄相關的函數是在一個名爲dirent.h的頭文件裏被申明的。它們使用一個名爲DIR的結構做爲子目錄處理操作的基礎。“子目錄流”(directory stream)指向DIR結構的指針,被用來完成各種普通的子目錄操作。
opendir,readdir函數:
#include <sys/types.h>
#include <dirent.h>
DIR * opendir(const char *name); 打開一個子目錄並建立一個子目錄流。
struct dirent *readdir(DIR *dirp); 返回一個結構體指針,結構體裏保存着子目錄流dirp中下一個目錄數據項的有關資料。
telldir函數:
long int telldir (DIR *dirp); 返回值裏記錄着子目錄流裏的當前位置。可在seekdir調用裏利用這個值對當前位置再做一次子目錄掃描。
seekdir函數:
void seekdir(DIR *dirp, long int loc);對dirp指定的子目錄流中的目錄數據項的指針進行設置,loc的值用來設置指針的位置。
closedir函數:
int closedir(DIR *dirp);關閉一個子目錄並釋放與之相關聯的資源。
------------------------------------------------------------------------
mmap函數:將創建一個指向一段內存的指針,該指針將與通過一個打開的文件描述符來訪問的文件的內容相關聯。
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
用傳遞off參數的辦法可以改變經共享內存段訪問的文件中數據的起始偏移值。
msync函數:把該內存段的某個部分或整段中的修改寫回到被映射文件裏,(或者從被映射的文件裏讀出)
#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
munmap函數:釋放內存段
int munmap(void *addr, size_t len);