當前位置: 首頁 > 綜合 >

Linux之從進程角度來理解文件描述符

2023-05-28 06:38:20 來源:博客園

文件描述符是一個非負整數,而內核需要通過這個文件描述符才可以訪問文件。當我們在系統中打開已有的文件或新建文件時,內核每次都會給特定的進程返回一個文件描述符,當進程需要對文件進行讀或寫操作時,都要依賴這個文件描述符進行。在Linux或類UNIX系統中內核默認會為每個進程創建三個標準的文件描述符,分別是0(標準輸入)、1(標準輸出)和2(標準錯誤)。

通過查看/proc/PID號/fd/目錄下的文件,就可以查看每個進程擁有的所有文件描述符。

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

當打開文件時系統內核就會為特定的進程自動創建對應的文件描述符。首先在一個Terminal中使用vi打開temp文件;


(資料圖片僅供參考)

mango@mango-ubuntu:~/Documents/filedesc$ vi temp

新打開一個Terminal并查看此進程的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

我們也可以手動定義文件描述符,并通過文件描述符操作文件;

創建文件描述符

exec文件描述符 <> 文件名

引用文件描述符

&文件描述符

關閉文件描述符

exec文件描述符<&-exec文件描述符>&-

我們touch一個文件,并將其文件描述符設置為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

如果我們設置文件描述符只允許讀,那么我們寫文件的時候就會報錯;

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

我們也可以創建一個同時可讀可寫的文件描述符;

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
標簽:
最近更新
15037178970
婚姻法
技術服務合同糾紛的常見類型有哪些?技術合同糾紛怎么處理?
訴訟離婚的法定情形有哪些?訴訟離婚的定義是什么?
怎么起訴別人侵犯我的肖像權?怎樣才算侵犯個人隱私權?
信用卡逾期銀行可以找父母嗎?借款人未按照約定的期限返還借款的怎么辦?
客戶拖欠貨款怎么辦?客戶拖欠貨款不給可以采取哪些方式?
小車撞電動車賠償標準是什么?小車撞電動車小車全責怎么理賠?
用抵押貸款購買房屋后 如確實無能力歸還貸款怎么辦?
醉酒駕車處罰流程是什么?醉酒駕駛涉嫌危險駕駛罪處罰內容是什么?
股權質押如何理解?股權質押到期可以約定自動解除嗎?
違反保密協議需要支付違約金嗎? 工程質量問題的違約金約定方法是什么?
知識糾紛
1 個人征信逾期記錄消除方法有哪些?個人征信逾期的法律依據是什么?
2 物證包括哪些?書證與物證的區別是什么?
3 哪些行為不能提起行政訴訟?行政訴訟證據有哪些類型?
4 土地承包經營權轉讓期限是多久?農村土地承包經營權轉讓程序分哪三種?
5 合同解除權的行使方式有哪些?合同解除權的行使方式法律依據是什么?
6 失業保險金期間可以享受哪些待遇?失業保險金時職工的工作年限是幾年?
7 經營婚姻的方法與技巧有哪些?經營婚姻的6個方法分享
8 快遞超過7天怎找誰賠償(快遞寄掉了怎么賠償)
公司法
家暴法律的判刑標準是什么?家暴立案必須滿足三個條件是什么?
關于房屋遺產稅可以避免么?應該怎么規避遺產稅?
中華人民共和國個人所得稅法第二條是什么?下列哪些個人所得應當繳納個人所得稅?
認定重婚罪需要滿足哪些條件?法律對重婚罪怎么處理?
判決書下來多久可以申請強制執行?欠款不還法院強制執行程序是什么?
家庭暴力相關的法律法規有哪些?實踐中實施家庭暴力應負什么法律責任?
民事執行程序有哪些步驟?民事執行申請書格式是什么?
欠錢不還找誰解決?民事訴訟法第一百二十二條內容是什么?
一般性作品著作權登記需提交的材料有什么?申請表的內容有哪些?
如何理解限制物權?限制物權擔保物權是什么?物權合同與債權合同的區別有哪些?
合同法
離婚撤銷的條件是什么? 可撤銷婚姻離婚怎么辦理?

2023-05-26

賣家不發貨怎么辦?民法典第五百六十三條的內容是什么?

2023-05-26

勞動者提前解除勞動合同應提前多少天通知?解除勞動合同時應辦理哪些手續?

2023-05-26

過失傷害他人身體致人輕傷會怎么被判刑?輕傷的量刑標準是什么?

2023-05-25

特殊家庭指的是什么?特殊家庭三個全覆蓋是哪三個?

2023-05-25

農村土地承包經營權證有什么用?土地承包經營權流轉程序是什么?

2023-05-25

勞動糾紛
離婚撤銷的條件是什么? 可撤銷婚姻離婚怎么辦理?
賣家不發貨怎么辦?民法典第五百六十三條的內容是什么?
勞動者提前解除勞動合同應提前多少天通知?解除勞動合同時應辦理哪些手續?
過失傷害他人身體致人輕傷會怎么被判刑?輕傷的量刑標準是什么?
特殊家庭指的是什么?特殊家庭三個全覆蓋是哪三個?
農村土地承包經營權證有什么用?土地承包經營權流轉程序是什么?

法律解答網版權所有 2005-2022

備案號:京ICP備2022016840號-54 聯系qq:920 891 263 @qq.com