Linux文件,文件描述符以及dup()和dup2()
一.Linux中文件
可以分為4種:普通文件、目錄文件、鏈接文件和設(shè)備文件。
1、普通文件
?? 是用戶日常使用最多的文件,包括文本文件、shell腳本、二進(jìn)制的可執(zhí)行和各種類型的數(shù)據(jù)。
??? ??? ls -lh 來(lái)查看某個(gè)文件的屬性,可以看到有類似 -rw-r--r-- ,值得注意的是第一個(gè)符號(hào)是 - ,這樣的文件在Linux中就是普通文件。這些文件一般是用一些相關(guān)的應(yīng)用程序創(chuàng)建,比如圖像工具、文檔工具、歸檔工具... .... 或 cp工具等。這類文件的刪除方式是用rm 命令;
2、目錄文件
????在linux中,目錄也是文件,它們是包含文件名和子目錄名以及指向那些文件和子目錄的指針
當(dāng)我們?cè)谀硞€(gè)目錄下執(zhí)行,看到有類似 drwxr-xr-x ,這樣的文件就是目錄,目錄在Linux是一個(gè)比較特殊的文件。注意它的第一個(gè)字符是d。創(chuàng)建目錄的命令可以用 mkdir 命令,或cp命令,cp可以把一個(gè)目錄復(fù)制為另一個(gè)目錄。刪除用rm 或rmdir命令。
3、鏈接文件
鏈接文件類似于Windows中的“快捷方式”。
是通過(guò)ln -s 源文件名 新文件名?? 來(lái)創(chuàng)建的。
4、設(shè)備文件
包括兩種,塊設(shè)備文件,另一種是字符設(shè)備文件
? ? ? ?塊設(shè)備文件是指數(shù)據(jù)的讀寫,它們是以塊為單位的設(shè)備,如硬盤光驅(qū)
? ? ? ?字符設(shè)備主要是指串行端口的接口設(shè)備,如網(wǎng)卡等。
二、文件描述符?
1、文件描述符及其作用
??內(nèi)核(kernel)利用文件描述符(file descriptor)來(lái)訪問(wèn)文件。文件描述符是非負(fù)整數(shù)。打開現(xiàn)存文件或新建文件時(shí),內(nèi)核會(huì)返回一個(gè)文件描述符。讀寫文件也需要使用文件描述符來(lái)指定待讀寫的文件。 對(duì)于 Linux 而言,所有對(duì)設(shè)備和文件的操作都使用文件描述符來(lái)進(jìn)行的。文件描述符是一個(gè)非負(fù)的整數(shù),它是一個(gè)索引值,并指向內(nèi)核中每個(gè)進(jìn)程打開文件的記錄表。當(dāng)打開一個(gè)現(xiàn)存文件或創(chuàng)建一個(gè)新文件時(shí),內(nèi)核就向進(jìn)程返回一個(gè)文件描述符;當(dāng)需要讀寫文件時(shí),
也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。
通常,一個(gè)進(jìn)程啟動(dòng)時(shí),都會(huì)打開 3 個(gè)文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯(cuò)處理。這3 個(gè)文件分別對(duì)應(yīng)文件描述符為 0、1和2也就是宏替換 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,鼓勵(lì)讀者使用這些宏替換)。
查看LINUX默認(rèn)的文件描述符,總共有1024個(gè),對(duì)于大多數(shù)情況下是夠用的:
# ulimit -n
查看進(jìn)程id
#ps aux
獲取某進(jìn)程文件描述符
cd /proc/[pid]/fd
[pid] 是對(duì)應(yīng)的進(jìn)程的pid.
#cd /proc/1473/fd
#sysctl -a | grep fs.file
nr就是已經(jīng)用的
三.dup和dup2
dup和dup2也是兩個(gè)非常有用的調(diào)用,它們的作用都是用來(lái)復(fù)制一個(gè)文件的描述符。
它們經(jīng)常用來(lái)重定向進(jìn)程的stdin、stdout和stderr。
這兩個(gè)函數(shù)的 原形如下:
#include