LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1247|回复: 4

重定向dup2

[复制链接]
发表于 2006-3-26 16:21:01 | 显示全部楼层 |阅读模式
[php]

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define TESTSTR "Hello dup2\n"
#define SIZEOFTESTSTR   11
int main(void)
{
        int     fd3;
        int     s_fd;
        int     n_fd;

        fd3 = open("testdup2.dat", 0666);
        if (fd3 < 0)
        {
                printf("open error\n");
                exit(-1);
        }

        s_fd = dup ( STDOUT_FILENO );
        if ( s_fd < 0 )
                printf("err in dup \n");

        n_fd = dup2 (fd3, STDOUT_FILENO);
        if(n_fd < 0)
        {
                printf("err in dup2\n");
        }
        printf(TESTSTR);                  《--------------
        if (dup2(s_fd,n_fd) < 0)
                printf("err in dup2\n");
        printf("ok\n");
        return 1;
}
[/php]

为什么用printf不能达到预期效果-将teststr输入到文件testdup2.dat当中,而用write是就可一,不明白怎么会事。
发表于 2006-3-26 16:43:06 | 显示全部楼层
printf 是带缓冲的,当数据还在缓冲的时候,你已经又用dup2将stdout还原了,在printf完了以后,加一句 fflush(stdou);

ps: write 是不带缓冲的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-26 16:58:58 | 显示全部楼层

谢谢斑竹啊

这个我也想到了,不过我是在printf后家了个sleep(3),还是不行,必须用fflush?
还是sleep的时间不够?
回复 支持 反对

使用道具 举报

发表于 2006-3-26 23:19:16 | 显示全部楼层
什么时候刷新缓冲是由内核决定的,并不是睡一段时间,内核就一定会刷新,这与当前内存可用量以及刷新策略决定,所以我们无法预测缓冲何时会刷新,只有强制他刷新
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-27 12:38:34 | 显示全部楼层
Thank you very much!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表