如何确定输入(stdin)是不是损坏?
Posted
技术标签:
【中文标题】如何确定输入(stdin)是不是损坏?【英文标题】:How to determine that input (stdin) is broken?如何确定输入(stdin)是否损坏? 【发布时间】:2016-07-26 15:16:53 【问题描述】:我正在开发一种用于核心转储处理的工具。使用sysctl
我将其设置为获取工具输入的核心转储。一切都很好。但是今天我遇到了(我不知道为什么)coredump被破坏的情况。当我将常规文件设置为 coredumps 目标时 - 它不会出现。所以 - 我认为它由于某种原因坏了。当我设置我的工具 tee
- 没有结果。
所以。我想确定这种情况(如果可能的话)并记录它而不是生成损坏的文件。
我正在使用::read(STDIN_FILENO,buff, buffSize)
来获取数据。最后read
只需返回0
。我想指出0
何时表示文件结束,何时表示管道损坏。
【问题讨论】:
你检查read
调用的结果了吗?
是的,我在最初的消息中写到了这一点。结果为零。
"最后它只是返回 0
" 听起来你在抱怨 buff
最后有零。下次请生成minimal reproducible example。对,那么,有什么问题吗?如果你得到0
,管道坏了....缺少什么?
我想指出0
何时表示文件结束,何时表示管道损坏。
【参考方案1】:
根据程序中的错误,anything 可能出错,并且没有可靠的方法来检测 what 出错甚至 if出了什么问题。
一旦程序执行未定义的行为或类似行为,所有赌注都将失败,您能做的最好的事情是希望某些报告渠道仍然可靠运行。 通常,您可以信任由操作系统内核编写的核心/小型转储,以可靠地捕获程序在崩溃时的状态。但是,如果您的程序损坏了堆栈或做了其他可怕的事情,那么您从这些转储中获得的堆栈跟踪仍然可能接近无法使用。
【讨论】:
我不关心核心转储的内容。我只是想通知用户 coredump 由于某种原因被破坏了。没有我的工具,这样的核心转储就会丢失。因为文件没有完成。但是我的工具在停止接收输入时才完成文件。所以。主要任务 - 是否可以确定输入已损坏? "是否可以确定输入已损坏?" - 在许多情况下,也许,可能。在最一般的情况下。没有。【参考方案2】:您已经发现:read
将返回 0,表示没有读取任何字节。对于像STDIN
这样的阻塞流,应该等到字节可以被读取,这是一个错误条件。
您不需要“另一个 API”;您只需阅读您正在使用的文档。
【讨论】:
以上是关于如何确定输入(stdin)是不是损坏?的主要内容,如果未能解决你的问题,请参考以下文章