Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427701
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2012-03-06 16:17:23

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下:
#include
int dup( int oldfd );
int dup2( int oldfd, int targetfd )
需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。 

    dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件.
int oldfd;
oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );
本例中,我们打开了一个新文件,称为“app_log”,并收到一个文件描述符,该描述符叫做fd1。我们调用dup2函数,参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。任何写到stdout的东西,现在都将改为写入名为“app_log”的文件中。需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。 


#include
#include
#include
#include

int main(void)
{
   #define STDOUT 1   //标准输出文件描述符 号

   int nul, oldstdout;
   char msg[] = "This is a test";

  

//打开一个文件,操作者具有读写权限 如果文件不存在就创建
   nul = open("DUMMY.FIL", O_CREAT | O_RDWR,
      S_IREAD | S_IWRITE);

  

//创建STDOUT的描述符备份
   oldstdout = dup(STDOUT);
  

//重定向nul到STDOUT ,此时,STDOUT指向的是null.
   dup2(nul, STDOUT);

  

//重定向之后要关闭nul
   close(nul);

  

//写入数据
   write(STDOUT, msg, strlen(msg));

  

//还原
   dup2(oldstdout, STDOUT);

  
   close(oldstdout);

   return 0;
}
 

//结果就是msg写到了文件中而不是STDOUT

阅读(1049) | 评论(0) | 转发(0) |
0

上一篇:内存分配相关内容

下一篇:linux 拷贝函数

给主人留下些什么吧!~~