dup和dup2函数
函数原型
int dup(int oldfd);
dup 函数对传入的文件描述符进行复制,返回一个新的文件描述符,这两个描述符共享同一个数据结构。 新的文件描述符一定是系统可用文件描述符的最小数值。
int fd1, fd2;
fd2 = dup( fd1 );
int dup2(int oldfd,int newfd);
对于 dup2函数 来说,则可以用 newfd 参数来指定新描述符的值。如果 newfd 已经打开,则先将其关闭。
int oldfd;
oldfd = open("log", (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );
在本例中,我们打开了一个”log”的文件,并收到一个文件描述符oldfd。我们调用dup2函数,将我们新打开的文件描述符替去换掉文件描述符1(即stdout,因为标准输出文件的id为1)。执行这个函数以后,任何写到stdout的东西,现在都将写入名为“log”的文件中。需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int fd[2];
if ( pipe(fd) == 0 ) {
if ( fork() == 0 ) { 子进程将标准输出的内容重定向到管道fd[1]中
close(1); 只输入,不输出
dup2( fd[1], 1 );
close( fd[0] );
execlp( "ls", "ls", "-l", NULL );
} else { 父进程将标准输入的内容重定向到管道fd[0]中
close(0);
dup2( fd[0], 0 );
close( fd[1] );
execlp( "wc", "wc", "-l", NULL ); 转到写命令
}
return 0;
}