2016-07-26 75 views
-1

我正在开发一个coredump处理工具。使用sysctl我将它设置为在工具的输入上获取coredump。一切都很好。但是今天我面对的情况是(我不知道为什么)coredump坏了。当我将常规文件设置为coredumps目标时 - 它不会出现。所以 - 我认为它出于某种原因被打破了。当我安装而不是我的工具tee - 没有结果。如何确定输入(stdin)被破坏?

所以。我想确定这种情况(如果可能的话)并记录它,而不是生成破损的文件。

我使用::read(STDIN_FILENO,buff, buffSize)来获取数据。并在结束read只是返回的0。我想指出什么时候0意味着文件结束,什么时候意味着管道损坏。

+0

您是否检查过'read'调用的结果? –

+0

是的,我在最初的消息中写到了这件事。结果为零。 “ – denys

+0

”结束它只是返回的'0'“听起来像你抱怨'buff'在最后零。请下次制作[MCVE]。对,那么问题是什么?如果你得到'0',管道就坏了......缺少什么? –

回答

1

根据在程序中的bug,什么可能出问题,并有检测没有可靠的方法什么出了问题,甚至如果什么出了问题。

只要一个程序行使未定义的行为或类似,所有的赌注都关闭,你能做的最好的是希望一些报告通道仍然有效,可靠。 通常,您可以信任由操作系统内核编写的核心/小型转储,以便在崩溃时可靠地捕获程序的状态。但是,如果你的程序损坏了堆栈或者做了其他可怕的事情,那么从这些转储中获得的堆栈跟踪仍然可能接近不可用。

+0

我不关心coredump的内容。我只是想通知用户,因为水渍造成Coredump损坏。没有我的工具,这种coredump就错过了。由于文件没有完成。但是我的工具只是在停止接收输入时完成文件。所以。主要任务 - 是否可以确定输入是否被破坏? – denys

+0

“是否可以确定输入是否被破坏?” - 在很多情况下,也许可能。在最一般的情况下。没有。 –

0

您已经发现:read将返回0,表示没有读取字节。为了阻止像STDIN这样的流,应该等到字节可以读取,这是一个错误条件。

你不需要“另一个API”;你只需要阅读你正在使用的文档。