一.Linux中文件
可以分為4種:普通文件、目錄文件、鏈接文件和設備文件。
1、普通文件
是用戶日常使用最多的文件,包括文本文件、shell腳本、二進制的可執行和各種類型的數據。
ls -lh 來查看某個文件的屬性,可以看到有類似 -rw-r--r-- ,值得注意的是第一個符號是 - ,這樣的文件在Linux中就是普通文件。這些文件一般是用一些相關的應用程序創建,比如圖像工具、文檔工具、歸檔工具... .... 或 cp工具等。這類文件的刪除方式是用rm 命令;
2、目錄文件
在linux中,目錄也是文件,它們是包含文件名和子目錄名以及指向那些文件和子目錄的指針
當我們在某個目錄下執行,看到有類似 drwxr-xr-x ,這樣的文件就是目錄,目錄在Linux是一個比較特殊的文件。注意它的第一個字符是d。創建目錄的命令可以用 mkdir 命令,或cp命令,cp可以把一個目錄復制為另一個目錄。刪除用rm 或rmdir命令。
3、鏈接文件
鏈接文件類似於Windows中的“快捷方式”。
是通過ln -s 源文件名 新文件名 來創建的。
4、設備文件
包括兩種,塊設備文件,另一種是字符設備文件
塊設備文件是指數據的讀寫,它們是以塊為單位的設備,如硬盤光驅
字符設備主要是指串行端口的接口設備,如網卡等。
二、文件描述符
1、文件描述符及其作用
內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件。 對於 Linux 而言,所有對設備和文件的操作都使用文件描述符來進行的。文件描述符是一個非負的整數,它是一個索引值,並指向內核中每個進程打開文件的記錄表。當打開一個現存文件或創建一個新文件時,內核就向進程返回一個文件描述符;當需要讀寫文件時,
也需要把文件描述符作為參數傳遞給相應的函數。
通常,一個進程啟動時,都會打開 3 個文件:標准輸入、標准輸出和標准出錯處理。這3 個文件分別對應文件描述符為 0、1和2也就是宏替換 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,鼓勵讀者使用這些宏替換)。
查看LINUX默認的文件描述符,總共有1024個,對於大多數情況下是夠用的:
# ulimit -n
查看進程id
#ps aux
獲取某進程文件描述符
cd /proc/[pid]/fd
[pid] 是對應的進程的pid.
#cd /proc/1473/fd
#sysctl -a | grep fs.file
nr就是已經用的
參考:百科http://baike.baidu.com/view/1303430.htm
三.dup和dup2
dup和dup2也是兩個非常有用的調用,它們的作用都是用來復制一個文件的描述符。
它們經常用來重定向進程的stdin、stdout和stderr。
這兩個函數的 原形如下:
#include <unistd.h>
int dup( int oldfd );
int dup2( int oldfd, int targetfd )
利用函數dup,我們可以復制一個描述符。傳給該函數一個既有的描述符,它就會返回一個新的描述符,
這個新的描述符是傳給它的描述符的拷貝。這意味著,這兩個描述符共享同一個數據結構。例如,
如果我們對一個文件描述符執行lseek操作,得到的第一個文件的位置和第二個是一樣的。
下面是用來說明dup函數使用方法的代碼片段:
int fd1, fd2;
...
fd2 = dup( fd1 );