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
阅读(1086) | 评论(0) | 转发(0) |