免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flyingbxf
打印 上一主题 下一主题

关于dup2()的疑问. [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-02-17 18:31 |只看该作者

关于dup2()的疑问.

dup2我没有用过,不过我知道freopen重定向输出到文件后如何恢复到终端上,不知和这个一样不一样。

论坛徽章:
0
12 [报告]
发表于 2004-02-17 20:03 |只看该作者

关于dup2()的疑问.

[quote]原帖由 "forest077"]dup2我没有用过,不过我知道freopen重定向输出到文件后如何恢复到终端上,不知和这个一样不一样。[/quote 发表:

freopen怎么恢复??用fclose()吗?

论坛徽章:
0
13 [报告]
发表于 2004-02-17 21:24 |只看该作者

关于dup2()的疑问.

原帖由 "flyingbxf" 发表:

怎么个保存法?压栈?还是用另外的指针指向STDOUT?

int saved_fd ;
saved_fd = STDOUT_FILENO; /* 保存标准输出 */

dup2(saved_fd, STDOUT_FILENO); /* 恢复标准输出 */

论坛徽章:
0
14 [报告]
发表于 2004-02-17 21:44 |只看该作者

关于dup2()的疑问.

freopen重定向后的恢复,基本原理是获得当前的tty,然后把输出流定向到当前tty即可,实现起来很简单,两三句话即可。范例如下:
//把stdout定向到文件aaa
fpout=freopen("aaa","w",stdout);
//现在printf会输出到文件aaa里面
fp=popen("tty","r";
fgets(str,sizeof(str),fp);
str[strlen(str)-1]=0;//当前tty保存在str里面了
fclose(fp);
//把fpout重定向到当前tty
freopen(str,"w",fpout);
//现在printf输出到当前终端
不知道这个功能适合不适合你。

论坛徽章:
0
15 [报告]
发表于 2004-02-17 21:45 |只看该作者

关于dup2()的疑问.

kj501的方式我要试一试,如果可以,比我的方便多了。

论坛徽章:
0
16 [报告]
发表于 2004-02-17 23:04 |只看该作者

关于dup2()的疑问.

kj501的方法我试过了不行呀

论坛徽章:
0
17 [报告]
发表于 2004-02-17 23:05 |只看该作者

关于dup2()的疑问.

原帖由 "flyingbxf"]alhost bxf 发表:
#为什么关掉文件后,还能把The end写进去?运行结果如下:
[root@localhost bxf]# ./a.out
[root@localhost bxf]# cat /var/log/ftp
have a test
The end!


这是因为你 dup2 后, stdout 和 fp 都指向文件 /var/log/ftp, 关掉其中一个后,另一个仍然可写。

论坛徽章:
0
18 [报告]
发表于 2004-02-17 23:08 |只看该作者

关于dup2()的疑问.

原帖由 "kj501" 发表:

int saved_fd ;
saved_fd = STDOUT_FILENO; /* 保存标准输出 */

dup2(saved_fd, STDOUT_FILENO); /* 恢复标准输出 */


你写错了吧?这几行程序一般相当于:

int saved_fd;
save_fd = 2;
dup2 (2, 2);

这怎么行?

论坛徽章:
0
19 [报告]
发表于 2004-02-17 23:12 |只看该作者

关于dup2()的疑问.

这个估计行:


  1. int sfd;
  2. sfd = dup (STDOUT_FILENO);  /* save */
  3. ....

  4. dup2 (sfd, STDOUT_FILENO); /* restore */

复制代码

论坛徽章:
0
20 [报告]
发表于 2004-02-18 17:45 |只看该作者

关于dup2()的疑问.

win_hate,你好!
如果我这么写:

int main(void)
{
        FILE *fp;
        int fd, id;
                                                                                
        id = dup(STDOUT_FILENO);
                                                                                
        fp = fopen("install.log", "w";
        if (fp == NULL) {
                printf("read error.\n";
                return 0;
        }
        fd = fileno(fp);
        dup2(fd, STDOUT_FILENO);
        printf("test\n";
        fclose(fp);
        printf("hello\n";
                                                                                
        dup2(id, STDOUT_FILENO);
        printf("world\n";
                                                                                
        return 0;
}

将在终端打印出
test
hello
world

如果我要做到在打开的文件install.log中写入
test
hello
而在终端输出
world
应该怎么作呢?

另外,在学习UNIX编程时我看的是APUE,感觉光看书中的例子还不够呀,那些例子功能比较单一,大多为了讲述一组函数的功能的,有没有那本书将大部分函数功能都用上,实现一个比较大的程序呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP