技术解析

问两个 Linux 下输出重定向的问题
0
2021-06-23 12:56:55
idczone

因为用到别人的库,没有源码,printf 很多又需要收集作为定位信息发给别人,遇到了两个问题 1. c 语言不修改 printf 这个函数,有没有办法做到 printf 既输出到 stdout,也输出到某个文件 我能想到的就是 dup2(fd, 1)之后,起一个线程把 fd 中新的内容扔到 stdout 中 不行的话只能 a.out >> a.log 了

dup2(fd, 1)之后,printf 了一个很少的信息+换行符也不能实时输出到 fd,不知道是不是因为缓冲区的原因 除了关闭 fd,有没有办法立即输出 试了 sync 没用


这个问题 doesn ’ t have to be Linux specific.
我不是 Linux 专家,不过简单的思路有 2。
对于取消缓冲,你可以用标准 C 的方式:输出完了之后立刻 fflush。
对于同时输出到两个出口,用 tee,它把标准输入复制到标准输出和一个指定的文件。

command | tee commad.log

关于不能实时输出到文件描述符,可能和这段说的有关系:
Normally - Unix and Linux systems apply some intelligence to handling standard output. It's assumed that if you are sending results to a terminal, you want the output as soon as it becomes available. However, if you are sending the output to a file, then it's assumed you want better performance, so it buffers the output until the buffer is full, and then the contents of the buffer is written to the file.

看了很多方案,查过很多资料,然后我还是决定自己写个函数,才几百行代码,大不了重定义 printf

tee Linux 的哲学,,一个工具只干好一件事件

我猜 tee 的原理就是获取数据后同时扔给 stdout 和文件?

哈哈哈,现成写文件的代码有,我司代码也是用的这个接口,就是第三方库里的 printf 不好替换

对,我也认为是有一个缓冲区 buffer

应该是的,,本来这种事情,就应该交给 tee 去做 而不是你又重新造个轮子

试了一下,用 pf=fopen 打开文件,用 setvbuf 设成 IONBF,然后在其中在 fork 一个进程里把 stdout=pf 就可以了(没有试线程,懒...)

文件打开的时候设置无缓冲呀

其实 linux 下几乎什么工具都有,而且都很优秀,只是能不能发现

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服