如何确定cout和cerr是否位于同一地点

时间:2019-06-26 14:46:24

标签: c++ stream cout

在C ++中是否有一种方法可以判断std :: cout和std :: cerr是否指向同一目的地?

也就是说,我希望能够像

那样启动程序

programprogram > log 2>&1program &> log

program > logprogram 2> errorsprogram > log 2> errors

(用例是一种情况,我们希望将错误信息分别打印到stdout和stderr上,但如果它们输出格式略有不同的输出(而不仅仅是串联),则希望将它们打印出来两者都去同一个目的地-是的,我知道这并不理想,也不是官方推荐的做事方式,不应将其视为标准的做事方式,但是请不过请相信我,我们已经花了一些时间思考问题,对于我们的特定用例,这是最好的选择。)

出于我们的目的,我们可以假设在程序本身中没有执行cout / cerr重定向(只是典型的shell级命令行重定向),因此,如果有C级功能可以直接查看stdout / stderr (而不是正确的std :: cout和std :: cerr流),这也可能会起作用。

2 个答案:

答案 0 :(得分:-1)

这是XY Problem的另一种情况。

您真正想要实现的目标是:

  

对于我们的最终用户用例,我们希望确保指示发生了什么错误的消息同时出现在stderr和stdout中(因为取决于我们的用户是否设置输出重定向,他们可能会或可能不会我们可以将每个内容打印一次(实际上是我们当前正在做的事情),但是如果stdout和stderr放在同一位置,那么如果我们可以重新格式化,它将更加清晰和用户友好删除多余打印的东西。

鉴于此目标,一种更清洁的机制将是允许用户指定他们希望将错误消息发送到的位置。例如

the-program --error-destination "stdout"
the-program --error-destination "stderr"
the-program --error-destination "stdout,stderr"
the-program --error-destination "/tmp/errro-messages.txt"
the-program --error-destination "stdout,/tmp/errro-messages.txt"

了解到“ stdout”和“ stderr”是特殊的目的地。其他都是文件。

答案 1 :(得分:-1)

如果您真的想在 linux 上了解,/proc/self/fd将显示所有内容!立即尝试ls -l /proc/self/fd ...

此外,如果您真的想向控制台发出错误,并且确定重定向已窃取您的输出,则可以随时将其发送到/dev/tty。不用担心/dev/stderr,因为这只是指向/proc/self/fd/2的链接!与此有关的一个问题是,如果您的程序是通过hup或类似程序从控制台分离的,则显然您不能使用/dev/tty