关于文件描述符的问题的解决

起因

吴哥的职业教程最开始的一段代码有一点不太理解,,教程里的第一个程序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*的下标
,关它就等于关闭了文件,
描述符就是从小到大排序
(虽然具体的我还是不太懂,答大体了解,具体的细节以后再扣)
,我等于自己打开了文件又被自己关了

小小的收获也很开心

受教了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值