#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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)