【问题标题】:Program that writes to /dev/stdout: how to send EOF?写入 /dev/stdout 的程序:如何发送 EOF?
【发布时间】:2017-12-05 08:45:20
【问题描述】:

我有一个将数据写入文件的程序。通常,该文件在磁盘上,但我正在尝试写入/dev/stdout。目前,当我这样做时,程序不会退出,直到我按下 Ctrl-C 。有没有办法让程序发出输出完成的信号?

编辑:

目前,一个磁盘文件是通过fopen(FILE_NAME)打开的,所以我现在尝试将/dev/stdout作为FILE_NAME传入。

编辑 2:

命令行是

MY_PROGRAM -i foo -o /dev/stdout > dump.png

编辑 3:

看起来这里的问题是stdout 已经打开,我正在第二次打开它。

【问题讨论】:

  • 用哪种语言编写的程序?
  • 另外——说/dev/stdout意味着你正在打开一个单独的句柄,而不是使用预先打开的FD 1。如果你正在做类似的事情,一个答案需要知道详细信息要完整完整——这是一个minimal reproducible example 会有所帮助的地方。
  • (实际上,open("/dev/stdout") 等价于 dup(1) ——它只是复制了一个您已经拥有的文件描述符,因为它是从父级继承的。如果没有令人信服的理由,这通常不是人们应该做的)。
  • Err -- 现在你说的是 C++,但是标记了 C。这是两种非常、非常不同的语言。您能否更正标签或文本以使它们保持一致?
  • 抱歉,是 c 和 c++ 的混合体 - 文件 io 使用较旧的 fopen/fclose 接口处理。

标签: c++ file unix stdout


【解决方案1】:

FIFO 上的 EOF 条件(如果您从您的程序通过管道传输到其他东西,这就是您的标准输出 )在没有文件句柄仍然打开以供写入时设置。

在 C 中,标准库是 fclose(stdout),而系统调用接口是 close(1)——如果您使用的是 fopen(),则需要将其与 fclose() 配对。


如果您还制作了单独的 outFile = fopen("/dev/stdout", "w") 或类似内容,那么您还需要关闭该副本:fclose(outFile)fclose(stdout)

【讨论】:

  • 谢谢!你是说fclose(1) 吗?
  • 不,我的意思是close(1)close 接受一个文件描述符,它是一个数字(0 表示标准输入,1 表示标准输出,2 表示标准错误,为其他句柄动态分配更高的值); fclose() 是一个更高级别的调用处理。如果要使用fclose,则需要fclose(stdout)
  • 谢谢!所以,我打电话给fclose(/dev/stdout),但我仍然需要在控制台中输入 Ctrl-C 才能退出程序。
  • @Jacko 不,你不是,你打电话给fclose(stdout)
猜你喜欢
  • 2019-10-28
  • 2021-06-03
  • 2011-01-21
  • 2017-10-20
  • 2013-07-20
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多