linux下重定向前后printf的输出缓存机制怎么变化

linux下重定向前后printf的输出缓存机制怎么变化,第1张

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

int main()

{

fflush(stdout)

setvbuf(stdout,NULL,_IONBF,0)

printf("test stdout\n")

int save_fd = dup(STDOUT_FILENO)// 保存标准输出 文件描述符 注:这里一定要用 dup 复制一个文件描述符. 不要用 = 就像是Winodws下的句柄.

int fd = open("test1.txt",(O_RDWR | O_CREAT), 0644)

dup2(fd,STDOUT_FILENO)// 用我们新打开的文件描述符替换掉 标准输出

printf("test file\n")

//再恢复回来标准输出. 两种方式

//方法1 有保存 标准输出的情况

//dup2(save_fd,STDOUT_FILENO)

//方法2 没有保存 标准输出的情况

int ttyfd = open("/dev/tty",(O_RDWR), 0644)

dup2(ttyfd,STDOUT_FILENO)

printf("test tty\n")

}

简单的说, 你用 printf 做打印,这个接口是带buffer的输出,重定向后如果打印的信息太少 (buffer没有满),那么信息是不会真正写到文件里去的(而是暂存在buffer中),当你ctrl-c的时候,buffer中的内容就全部丢失了。比较简单直接的解决方法有:

1: 每次输出后都强制清空buffer,如下

        while (1)

        {

                printf("hallo world\n")

                fflush(stdout)

                sleep (1)

        }

2. 使用不带buffer的输出接口,如 write


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8293373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存