文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>【点滴】dup2的应用

【点滴】dup2的应用

时间:2009-08-06  来源:moto_linux

一个人在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的文件名字。

相关阅读 更多 +
排行榜 更多 +
动物大战僵尸I

动物大战僵尸I

飞行射击 下载
龙兽争霸无限零件图纸

龙兽争霸无限零件图纸

飞行射击 下载
金属战士2最新版

金属战士2最新版

飞行射击 下载