linux程序設計第三章 文件 目錄操作讀書筆記

第三章:文件系統
比較重要的設備文件有三個,它們是/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);

 

發佈了28 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章