【问题标题】:Can a program output be redirected to a pipe through program itself?程序输出可以通过程序本身重定向到管道吗?
【发布时间】:2011-09-20 15:34:17
【问题描述】:

这是关于比赛的节目。

我正在提交一个程序并发现我的指标在总执行速度方面比得分最高的人要慢得多。所有其他(页面错误,内存......)都是相似的。我发现当我在没有 printf(或 write)的情况下运行我的程序时,我的总执行速度(在我自己的电脑上测量)似乎是相似的。

比赛通过将输出(我想是用管道)重定向到一个文件并将其 MD5 与他们的匹配来评估输出......

我的问题是,C 中是否有任何东西不会写入输出流,但管道仍会获取其输入。或者我什至把这个问题定错了。但无论哪种方式,我都在解决问题。

我一直在努力优化算法。顺便说一句,他们接受许多人试图优化的makefile。对我来说,这两个优化标志都不起作用。我也不知道还能做些什么……

【问题讨论】:

  • stdout 应该被缓冲,应该会产生相当低的开销。您可以尝试将printfsprintf 的调用更改为缓冲区,看看它是否仍然表现不佳?另外,您的输出需要格式化吗?
  • 如果他们将输出重定向到文件,为什么不按照他们的方式在外部进行呢?在linux中执行命令时,写:./program > my_output
  • @Hasturkun。每个测试用例产生的输出少于 512 个字符,而 512 是我的缓冲区大小...您建议的缓冲区大小是多少,因为我不知道测试用例的数量。
  • @Shahbaz 我不知道他们将我的输出重定向到哪里。
  • @loxxy:我对sprintf 的建议主要是看看您是否因printf 调用本身而遭受开销,即。在没有实际输出的情况下进行格式化。这主要是因为我不知道您的数据是如何表示和输出的。一个代码 sn-p 可能会有所帮助

标签: c linux pipe filestream


【解决方案1】:

如果您需要编写一个将其输出写入文件的程序,您只需要:

  • int fd = fopen("/file/path", O_WRONLY);打开文件(你可能需要检查参数,很久没做C编程了)然后write(fd, ...);fprintf(fd, ...);
  • 使用 fopen 打开文件,关闭标准输出并使用dup2() 将文件描述符复制到文件描述符编号 1(即标准输出)。

【讨论】:

  • 我不需要写入文件。当他们将其重定向到某个文件时,我需要将其写入标准输出本身。我所知道的是,这个“写入标准输出”部分花费的时间太长了。
【解决方案2】:

您可以在管道 fd 上尝试 fprintf。

【讨论】:

  • 我无法获得他们使用的管道的文件描述符,可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多