同时把输出重定向到两个文件里

zalyer 2010-09-25 06:15:52
如何把一个输出流同时写到2个文件里?像unix下的tee命令一样,可以同时写到多个文件。|tee file1 file2
比如有一个文件描述符a,所有的流都被写到a对应的文件里。
现在我开了一个新的文件,它对应的文件表述符是b。

现在我想从某一时刻开始把写到a的内容同时写到b里(前提但是我不知道谁写到a里的)。

我试着用dup2(b,a), 这样可以把内容写到b里,但是a里的就没有了。
因为dup2会先关闭a。

请问有什么办法可以实现我的要求?同时让输入流写到a,b所对应的文件里?
用c,c++实现

谢谢
...全文
378 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
NETOCOOL 2010-12-13
  • 打赏
  • 举报
回复
echo "test" | tee -a file1 file2 > /dev/null
justkk 2010-09-26
  • 打赏
  • 举报
回复
tee的原理好像就是读取标准输入,同时写入标准输出及命令行中的文件
自己实现也不麻烦
zalyer 2010-09-26
  • 打赏
  • 举报
回复
to guosha:
我没有办法控制输出的地方,因为输出是上层的程序输出的,我只能得到应用程序输出到的文件描述符。
我可以把这个定向到一个管道,然后在读管道写到两个地方。可以试试


to justkk:
这个方法我可以试试,从某一时刻开始记录下原来文件的位置,然后读出写入到另一个文件里。
但是,这样可能会有点问题,有可能不好同步读写。我试试。

谁还其他更容易的方法?谢谢
快乐田伯光 2010-09-25
  • 打赏
  • 举报
回复

int pid;
int pfd[2];

iRtn = pipe(pfd);

//creat sub process 1 do your business
pid = fork()
if pid == 0
{
close(pfd[1]);
dup2(pfd[0], 0);
# now this sub process's standard output was redirect to pfd[0]
exit(0)
}

//create sub process 2 do dump sub process 1 standard output to file 1 and file 2
pid = fork()
if pid == 0
{
close(pfd[0]);
//read from pfd[1] and append the content readed from pfd[1] to file1 and file2
exit(0)
}


快乐田伯光 2010-09-25
  • 打赏
  • 举报
回复
这个可以去看tee的源代码, 我觉得下面这种方式在应用层可以实现,不一定跟tee的实现完全一致.
首先创建一个管道, 然后把子进程的标准输出用dup定向到这个管道的输入. 这样子进程exec任何命令都输入到了这个管道.
父进程读取管道的输出,然后把所有读到的输出数据,分别写入file1, file2.

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧