免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 956 | 回复: 0
打印 上一主题 下一主题

【点滴】dup2的应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-06 21:18 |只看该作者 |倒序浏览
一个人在CU上面问:

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include sys/types.h>
#include sys/stat.h>
#include "fcntl.h"
#define STDOUT 1
int main(){
    int oldpd;
    oldpd=open("a.log",(O_RDWR | O_CREAT),0644);
    dup2(oldpd,STDOUT);
    printf("A simple Test String\n");
    //这里加代码使得下面的语句再输出到标准输出上,而不是a.log里
    printf("hello world\n");
    return 0;
}
如上所述,第一次输出的“A simple Test String”将被输出到a.log里,但我希望之后的"hello world"再输出到标准输出上,应该怎么做?
谢谢!
----------------
http://linux.chinaunix.net/bbs/viewthread.php?tid=1128130&pid=7084423&page=1&extra=page%3D1
我的答案是:
    int oldfd;   
    int newfd;
    char *tty_name=ttyname(STDOUT_FILENO);
    printf("ttyname:%s\n",tty_name);
   
    oldfd=open("a.log",(O_RDWR | O_CREAT),0644);   
    newfd=dup2(oldfd,STDOUT_FILENO);
    printf("A simple Test String: %d\n",newfd);   
    close(STDOUT_FILENO);
    open(tty_name,O_RDWR);
    printf("hello world\n");
    return 0;
输出是:
$ ./hole.o
ttyname:/dev/pts/0
hello world
文件内容是:
$ cat a.log
A simple Test String: 1
----
int dup2(fd_old,fd_new);
的作用是:
如果在新的文件描述符fd_new上复制原来的文件描述符fd_old
然后fd_old,fd_new指向共同的文件表项。如果原来fd_new是打开的,那么我们就关闭原来的fd_new,然后用fd_new指向fd_old指向的文件表项。
所以在这个应用中调用
dup2(oldfd,STDOUT_FILENO);后
STDOUT_FILENO就已经被关闭,然后再在STDOUT_FILENO上打开了fd_old指向的文件表项。
这是我们如果想恢复STDOUT_FILENO,只能再次打开了。而这是我们只能根据文件名字来打开了。所以我们用ttyname(STDOUT_FILENO);先得到并保存了stdout的文件名字。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101728/showart_2020098.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP