当前位置:  开发笔记 > 编程语言 > 正文

在bash中重定向C程序输出时出现问题

如何解决《在bash中重定向C程序输出时出现问题》经验,为你挑选了2个好方法。

我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设置缓冲区大小和行为.



1> gclj5..:

换行后的刷新仅在打印到终端时有效,但在打印到文件时不一定.谷歌的快速搜索在此页面上显示了更多信息:http://www.pixelbeat.org/programming/stdio_buffering/

请参阅标题为"默认缓冲模式"的部分.

毕竟,你可能不得不为fflush(stdout)添加一些调用.

您还可以使用setvbuf设置缓冲区大小和行为.



2> user10892..:

刷新缓冲区通常由exit()函数处理,函数通常return由main()隐式调用.您通过引发SIGINT结束程序,显然默认的SIGINT处理程序不会刷新缓冲区.

看看这篇文章: 应用设计模式简化信号处理.这篇文章主要是C++,但在第二部分中有一个有用的C示例,它展示了如何使用SIGINT优雅地退出程序.

至于终端的行为与文件的不同之处,请参阅UNIX环境第5.4节中关于缓冲的史蒂文斯的高级编程.他说:

大多数实现默认为以下类型的缓冲.标准错误始终是无缓冲的.如果它们引用终端设备,则所有其他流都是行缓冲的; 否则,它们是完全缓冲的.本书中讨论的四个平台遵循标准I/O缓冲的这些约定:标准错误是无缓冲的,对终端设备开放的流是行缓冲的,所有其他流都是完全缓冲的.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有