关于文件描述符的问题的解决
起因:
吳哥的職業教程最開始的一段代碼有一點不太理解,,教程里的第一個程序crtsurfdata.cpp的開頭,
在打開 日志文件 之前,
調用了 CloseIOAndeSignal的函數用來
關閉全部的信號和輸入輸出。。。
我就很奇怪:就是這個"關閉全部信號和輸入輸出”操作只能寫在 “打開日志文件“操作之前么?
我 嘗試了 在 “打開日志文件”操作 之后再關閉全部的信號和輸入輸出,結果后面的日志文件crtsurfdata.log始終為空,日志寫不進去。。。對于這個我很不理解,,不知是哪里沒有學到,,
代碼如下:
解決方法:
1.完全摸不著頭腦,就問問題去
在群里問了錕哥,他提到了原因是:
*我關閉了日志的文件描述符 close(i),這個 i 就是描述符*2.問題又來了:文件描述符是啥
我去查了什么是文件描述符 摘取我能夠看懂的片段如下 《百度百科》: **文件描述符與文件指針的區別** ***文件描述符***: 在linux系統中打開文件就會獲得文件描述符, 它是個很小的非負整數。 每個進程在PCB(Process Control Block) 中保存著一份文件描述符表, 文件描述符就是這個表的索引, 每個表項都有一個指向已打開文件的指針。***文件指針***: C語言中使用文件指針做為I/O的句柄。 文件指針指向進程用戶區中的一個被稱為FILE結構的數據結構。 FILE結構包括一個緩沖區和一個文件描述符。 而文件描述符是文件描述符表的一個索引, 因此從某種意義上說文件指針就是句柄的句柄 (在Windows系統上,文件描述符被稱作文件句柄)。 [3]3.我進行了初步的理解
(以下只討論 信號操作中 涉及 文件描述符的 相關問題,因為我就是這方面遇到問題了)
“先打開日志文件,再關閉信號”
相當于,我“打開文件",生成了 寫有“文件”他家的電話的”備忘錄“(文件描述符), 然后,我又“關閉所有信號”, 就是把這個"備忘錄“(文件描述符)給撕了, 就不可能通過打電話(因為我只有這一個備份且只有3s記憶) (即途徑:文件描述符->已經打開的文件的地址指針->文件) 聯系到已經走丟了的“文件”, 讓他干這干那的(即將程序日志寫入文件), 所以最后日志無法寫入文件“先關閉信號,再打開日志文件”
相當于,我“關閉信號”, 把記有所有朋友的電話號的"備忘錄“(文件描述符)撕了(關了), 然后,我"打開文件", //這時,在打開文件的操作中, //會重新寫一個 標記有這個文件的地址信息的‘描述符’, //函數返回已經打開的文件的指針, //后面通過 //描述符->指針->文件 //可以找到 相應的文件, //從而進行 寫日志 操作,可以這么說“盡管我撕了我從前的備忘錄//(先關閉了所有信號,包括如果可能會有的文件描述符),但是認識你是這之后發生的事情,//(打開新的文件操作,是之后發生的事情)我就為你專門又寫了一個備忘錄,//(打開文件時,就寫了相應的文件描述符)這樣就可以隨時聯系到你”//(讓你替我寫日志)而第二種情況,才是我想要的結果,
既“關閉所有信號和輸入輸出”,
又‘成功打開日志文件,
從而順利進行寫程序日志的操作’
而且在CloseIOAndSignal函數里面,
通過,調用信號庫函數signal函數,
讓父進程忽略子進程的退出信號,
可以避免產生僵尸進程,
并且屏蔽了所有信號,
不管用Ctrl+c還是killall的方式,
程序都可以體面的退出,
(此段為日常背書,多進程剛剛接觸,如果有說的不對的,歡迎指出)
4.最后再次征詢錕哥的看法,驗證我想的是對的,不過看的更透徹,
描述符fd就是文件指針FILE*的下標 ,關它就等于關閉了文件, 描述符就是從小到大排序 (雖然具體的我還是不太懂,答大體了解,具體的細節以后再扣) ,我等于自己打開了文件又被自己關了小小的收獲也很開心
受教了!
總結
以上是生活随笔為你收集整理的关于文件描述符的问题的解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《实用》secureCRT远程连接lin
- 下一篇: 库函数设计:关于文件类打开操作函数不自动