tcflush与unbuffered I/O,buffered I/O

tcflush就是清除输入/输出数据的。但是我们会看到,采用不同的I/O函数确有不同的结果。
代码一:buffered I/O
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
                                                                                   
int main(void)
{
       printf("hello word.");      //可以看到输出,如果改为 printf("hello word./n"); 将看不到输出
                                                                                   
       if (tcflush(STDOUT_FILENO, TCIOFLUSH) == -1) {
            e xit(1);
       }
                                                                                   
       exit(0);
}

代码二:unbuffered I/O
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

int main(void)
{
        char Myinfo[26]="hello word!"; //加不加‘/n’都无法看到输出

        write(STDOUT_FILENO,Myinfo,26);
        if (tcflush(STDOUT_FILENO, TCIOFLUSH) == -1) {
                exit(1);
        }

        exit(0);
}

分析其原因,其实就是因为printf是个buffered I/O函数,所以导致在调用tcflush的时候并没有真正的进入到终端输出文件中。我们再看下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

int main(void)
{
        char Myinfo[26]="hello word!/n";
        char Myinfo1[26]="jack";
        printf("Hello");
        write(STDOUT_FILENO,Myinfo1,26);                           //是必定无法看到的
        if (tcflush(STDOUT_FILENO, TCIOFLUSH) == -1) {
                exit(1);
        }

        write(STDOUT_FILENO,Myinfo,26);
        exit(0);
}
我们调用运行,可能会有多次不同的结果,有时候是:
hello word
Hello
也可能是:
Hello
hello word
那么是不是代码一中也可能是看不到结果的呢?答案应该是一定的,在特定的环境下,是会有这样的情况发生的。所以,如果要调用tcflush来达到目的,可以应该调用unbuffered I/O来避免不定因数的产生。当然也可以通过setvbuf(stdout, NULL, _IONBF, 0);来达到目的。如:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
                                                                                   
int main(void)
{
        setvbuf(stdout, NULL, _IONBF, 0);
       printf("hello word.");      //将无法看到输出
                                                                                   
       if (tcflush(STDOUT_FILENO, TCIOFLUSH) == -1) {
            exit(1);
       }
                                                                                   
       exit(0);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值