我有一个程序正在运行无限循环,直到收到信号才会终止CTRL+C
。我想要做的是将该程序的输出重定向到文件中,例如log
。但是,在我CTRL+C
编辑程序之后,没有任何内容被记录到log
。我认为这可能是与 I/O 缓冲区相关的一些问题,但不知道如何解决。我走在正确的轨道上吗?如何将无限循环程序的输出转储到文件中?
答案1
如果你的程序使用标准输出函数(例如puts
,以及C、C++ 和许多高级语言中printf
的函数),那么它的输出是stdio.h
cout << …
print
缓冲的:字符会累积在称为缓冲区的内存区域中;当缓冲区中的数据过多时,会打印缓冲区的内容(即“刷新”),缓冲区将变空(准备再次填充)。如果您的程序没有产生太多输出,则可能是因为缓冲区尚未填满。
Ctrl当你使用+终止程序时C,除非你已设置信号处理程序信号情报,它就死掉了。所有未刷新的缓冲区的内容都会丢失。
您有三种可能:
- 为 SIGINT 编写一个信号处理程序,用于刷新输出缓冲区(
fflush(stdout)
或fflush(NULL)
刷新所有缓冲区)。 - 将程序设置为不缓冲其输出:调用
setvbuf(stdout, NULL, _IONBF, 0)
。(参见自动刷新的 C 等效项(每次写入后刷新标准输出)?) - 在模拟终端的环境下运行程序,这样就不会发生缓冲。请参阅关闭管道缓冲
答案2
脚本(无论是否无限循环)应逐渐保存重定向的数据,因此脚本的性质不应影响结果。数据应逐渐写入...
或者(如果根本没有输出,甚至没有重定向)您可能想要尝试fflush(stdout)
或采取类似措施。
只是一个想法(虽然可能性很小)...你确定重定向STDOUT
是你应该做的吗?难道不是吗STDERR
?尝试使用以下命令运行二进制文件/脚本/...:
$ ./program 2> ./stderr_out
然后cat ./stderr_out
确保STDERR
不是那个...