Linux之從進(jìn)程角度來理解文件描述符
2023-05-28 06:38:20 來源:博客園
文件描述符是一個非負(fù)整數(shù),而內(nèi)核需要通過這個文件描述符才可以訪問文件。當(dāng)我們在系統(tǒng)中打開已有的文件或新建文件時,內(nèi)核每次都會給特定的進(jìn)程返回一個文件描述符,當(dāng)進(jìn)程需要對文件進(jìn)行讀或?qū)懖僮鲿r,都要依賴這個文件描述符進(jìn)行。在Linux或類UNIX系統(tǒng)中內(nèi)核默認(rèn)會為每個進(jìn)程創(chuàng)建三個標(biāo)準(zhǔn)的文件描述符,分別是0(標(biāo)準(zhǔn)輸入)、1(標(biāo)準(zhǔn)輸出)和2(標(biāo)準(zhǔn)錯誤)。
通過查看/proc/PID號/fd/目錄下的文件,就可以查看每個進(jìn)程擁有的所有文件描述符。
mango@mango-ubuntu:~/Documents/filedesc$ sudo ls -l /proc/$$/fdtotal 0lrwx------ 1 mango mango 64 5月 24 11:08 0 -> /dev/pts/1lrwx------ 1 mango mango 64 5月 24 11:08 1 -> /dev/pts/1lrwx------ 1 mango mango 64 5月 24 11:08 2 -> /dev/pts/1lrwx------ 1 mango mango 64 5月 24 11:08 255 -> /dev/pts/1當(dāng)打開文件時系統(tǒng)內(nèi)核就會為特定的進(jìn)程自動創(chuàng)建對應(yīng)的文件描述符。首先在一個Terminal中使用vi打開temp文件;
(資料圖片僅供參考)
mango@mango-ubuntu:~/Documents/filedesc$ vi temp新打開一個Terminal并查看此進(jìn)程的fd信息;
mango@mango-ubuntu:~/Documents/filedesc$ sudo ps -a | grep vi 8888 pts/1 00:00:00 vimango@mango-ubuntu:~/Documents/filedesc$ sudo ls -l /proc/8888/fdtotal 0lrwx------ 1 mango mango 64 5月 24 11:22 0 -> /dev/pts/1lrwx------ 1 mango mango 64 5月 24 11:22 1 -> /dev/pts/1lrwx------ 1 mango mango 64 5月 24 11:22 2 -> /dev/pts/1lrwx------ 1 mango mango 64 5月 24 11:22 3 -> /home/mango/Documents/filedesc/.temp.swp我們也可以手動定義文件描述符,并通過文件描述符操作文件;
創(chuàng)建文件描述符
exec文件描述符 <> 文件名引用文件描述符
&文件描述符關(guān)閉文件描述符
exec文件描述符<&-exec文件描述符>&-我們touch一個文件,并將其文件描述符設(shè)置為10,并通過這個文件描述符來操作文件;
mango@mango-ubuntu:~/Documents/filedesc$ touch testfile11mango@mango-ubuntu:~/Documents/filedesc$ sudo ls -l /proc/$$/fdtotal 0lrwx------ 1 mango mango 64 5月 24 11:39 0 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 1 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 2 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 255 -> /dev/pts/2mango@mango-ubuntu:~/Documents/filedesc$ exec 10>testfile11mango@mango-ubuntu:~/Documents/filedesc$ echo hello >&10mango@mango-ubuntu:~/Documents/filedesc$ echo "world">&10mango@mango-ubuntu:~/Documents/filedesc$ cat testfile11helloworldmango@mango-ubuntu:~/Documents/filedesc$ exec 10<&-mango@mango-ubuntu:~/Documents/filedesc$ echo "closed">&10bash: 10: Bad file descriptor如果我們設(shè)置文件描述符只允許讀,那么我們寫文件的時候就會報錯;
mango@mango-ubuntu:~/Documents/filedesc$ exec 11&11bash: echo: write error: Bad file descriptormango@mango-ubuntu:~/Documents/filedesc$ ls -l /proc/$$/fdtotal 0lrwx------ 1 mango mango 64 5月 24 11:39 0 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 1 -> /dev/pts/2lr-x------ 1 mango mango 64 5月 24 11:52 11 -> /home/mango/Documents/filedesc/testfile11lrwx------ 1 mango mango 64 5月 24 11:39 2 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 255 -> /dev/pts/2mango@mango-ubuntu:~/Documents/filedesc$ exec 11<&-mango@mango-ubuntu:~/Documents/filedesc$ ls -l /proc/$$/fdtotal 0lrwx------ 1 mango mango 64 5月 24 11:39 0 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 1 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 2 -> /dev/pts/2lrwx------ 1 mango mango 64 5月 24 11:39 255 -> /dev/pts/2 我們也可以創(chuàng)建一個同時可讀可寫的文件描述符;
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<>testfile11mango@mango-ubuntu:~/Documents/filedesc$ cat <&11helloworldmango@mango-ubuntu:~/Documents/filedesc$ echo "read write" >&11mango@mango-ubuntu:~/Documents/filedesc$ cat <&11mango@mango-ubuntu:~/Documents/filedesc$ exec 11<>testfile11mango@mango-ubuntu:~/Documents/filedesc$ cat <&11helloworldread writemango@mango-ubuntu:~/Documents/filedesc$ exec 11<&-mango@mango-ubuntu:~/Documents/filedesc$ cat <&11bash: 11: Bad file descriptor