我C编码的一个程序,用printf将消息发送到标准输出和我无法将输出重定向到一个文件(从bash中运行).
我试过了:
./program argument >> program.out ./program argument > program.out ./program >> program.out argument ./program > program.out argument
在每种情况下,都会创建文件program.out但它仍然为空.执行结束后,文件大小为0.
如果我在执行程序时省略重定向:
./program argument
然后,使用printf发送到stdout的所有消息都显示在终端中.
我有其他C程序,我没有问题以这种方式重定向输出.它与程序本身有关吗?与论点传递?应该在哪里寻找问题?
关于C程序的一些细节:
它没有从stdin中读取任何内容
它使用BSD Internet Domain套接字
它使用POSIX线程
它使用sigaction为SIGINT信号分配一个特殊的处理函数
它向stdout发送了许多换行符(对于那些认为我应该刷新的人)
一些代码:
int main(int argc, char** argv) { printf("Execution started\n"); do { /* lots of printf here */ } while (1); /* Code never reached */ pthread_exit(EXIT_SUCCESS); }
gclj5.. 15
换行后的刷新仅在打印到终端时有效,但在打印到文件时不一定.谷歌的快速搜索在此页面上显示了更多信息:http://www.pixelbeat.org/programming/stdio_buffering/
请参阅标题为"默认缓冲模式"的部分.
毕竟,你可能不得不为fflush(stdout)添加一些调用.
您还可以使用setvbuf设置缓冲区大小和行为.
换行后的刷新仅在打印到终端时有效,但在打印到文件时不一定.谷歌的快速搜索在此页面上显示了更多信息:http://www.pixelbeat.org/programming/stdio_buffering/
请参阅标题为"默认缓冲模式"的部分.
毕竟,你可能不得不为fflush(stdout)添加一些调用.
您还可以使用setvbuf设置缓冲区大小和行为.
刷新缓冲区通常由exit()
函数处理,函数通常return
由main()隐式调用.您通过引发SIGINT结束程序,显然默认的SIGINT处理程序不会刷新缓冲区.
看看这篇文章: 应用设计模式简化信号处理.这篇文章主要是C++,但在第二部分中有一个有用的C示例,它展示了如何使用SIGINT优雅地退出程序.
至于终端的行为与文件的不同之处,请参阅UNIX环境第5.4节中关于缓冲的史蒂文斯的高级编程.他说:
大多数实现默认为以下类型的缓冲.标准错误始终是无缓冲的.如果它们引用终端设备,则所有其他流都是行缓冲的; 否则,它们是完全缓冲的.本书中讨论的四个平台遵循标准I/O缓冲的这些约定:标准错误是无缓冲的,对终端设备开放的流是行缓冲的,所有其他流都是完全缓冲的.