起因

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

小小的收获也很开心

受教了!

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

  1. Python 中如何解决 asyncio 文件描述符最大数量限制问题

    文章目录 问题复现 问题分析 事件循环 EventLoop I/O 多路复用 select 的缺点 解决方法 1.更换事件循环选择器 2.限制并发量 3.修改最大文件描述符限制 Windows Lin ...

  2. linux文件描述符与标识符,文件描述符fd

    这里以问答的方式来讨论这个问题: 1. 文件描述符 fd 和文件指针 FILE *的关系? 文件描述符是什么?我们知道每一个进程都有一个自己的PCB(进程控制块),进程控制块的结构是: struct ...

  3. Linux系统学习笔记:文件描述符标志

    文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...

  4. mysql 打开文件数_MySQL打开的文件描述符限制

    如果遇到如下错误: Can't open file: '.\test\mytable.frm' (errno: 24) shell> perror 24 OS error code 24: To ...

  5. Linux服务器文件描述符最大值修改

    文件描述符的有效范围是 0 到 OPEN_MAX.Linux 2.4.22 强制规定最多不能超过 1,048,576 . 文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件.文件描述符与包 ...

  6. iofd:文件描述符_文字很重要:谈论设计时18个有意义的描述符

    iofd:文件描述符 As designers, many of us think we're just visual creatures. But creating visuals is only ...

  7. jvm 助记符_您的JVM是否泄漏文件描述符-像我的一样?

    jvm 助记符 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快 ...

  8. 您的JVM是否泄漏文件描述符-像我的一样?

    前言:此处描述的两个问题是在一年前发现并修复的. 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且无垃圾的有效 ...

  9. 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向

    本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处: linux下的文件描述符是与文件输入.输出相关联 ...

最新文章

  1. Linux Terminal 控制终端的使用
  2. 使用@OrderBy对Spring Data MongoDB集合进行排序
  3. Maven创建的Web项目无法使用EL表达式
  4. 安装配置tomcat
  5. 21套非常棒的网页设计图标素材
  6. 《NLTK基础教程——用NLTK和Python库构建机器学习应用》——2.10 练习
  7. oracle11g和10的区别,同平台升级 oracle 10 到 oracle11g的一些考虑和实际操作
  8. 程序员如何写工作日志
  9. 黑色HTML5网站整站源码
  10. axios 最详细封装
  11. 有没有不用加班的程序员?如何衡量程序员的工作量?
  12. Http 417错误
  13. 软件开发七宗罪(转)
  14. sap开发语言_海纳易拓:认识SAP顾问的职业前景
  15. 苹果账号总说连接服务器时出错,苹果手机连接iTunes时老是提示 “连接到AppleID服务器时出错”,怎么处理?...
  16. 不怕新歌有多嗨,就怕老歌带DJ,Python批量对DJ歌曲进行下载
  17. android 5.0播放swf flash源码Demo
  18. Excel中回车换行
  19. 综述天分、标网、矢网、扫频仪的异同
  20. Git 删除 GitHub仓库的文件——详细操作 githua如何删除文件

热门文章

  1. python鸢尾花数据集聚类_R语言鸢尾花iris数据集的层次聚类分析
  2. 计算机毕业论文多久,计算机毕业论文
  3. python程序设计丁亚涛课后答案_python程序设计丁亚涛版课后答案
  4. 上验证cudnn是否安装成功_windows和linux上的tensorflow安装(极简安装方法)
  5. springboot文件上传服务器,SpringBoot: 浅谈文件上传和访问的坑 (MultiPartFile)
  6. 3. nginx的请求转发算法,如何配置根据权重转发
  7. jQuery解决高度统一问题
  8. C# WPF Application 下的文件操作
  9. C#3.0 新特性系列(6) Extension Methods
  10. PAT (Basic Level) Practice (中文)1023 组个最小数 (20 分) (排序)