1、描述:
上一篇我们讲到文件描述符的相关知识,而dup和dup2这两个的作用都是:复制一个现存的文件描述符。
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
当调用dup时,内核在进程中创建一个新的文件描述符,这个文件描述符是现有可用文件描述符中最小的,而且它指向的是oldfd所指向的文件。
而dup2不同的是,如果newfd已经打开,则将其关闭,如果newfd等于oldfd,则返回newfd,而不关闭它,说白了就指定一个文件描述符,而dup是取可用范围内的最小的。
实际上:
调用dup(oldfd)等效于,fcntl(oldfd,F_DUPFD,0);
调用dup2(oldfd,newfd)等效于,close(newfd),fcntl(oldfd,F_DUPFD,newfd);
2、代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char* argv[])
{
int fd = open("hello", O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
if(fd < 0)
{
printf("Open Error!!\n");
return 0;
}
int nfd = dup(fd);
if(nfd < 0)
{
printf("Error!!\n");
return 0;
}
char buf[1000];
int n;
while((n = read(STDIN_FILENO, buf,1000)) > 0)
{
if(write(nfd, buf, n) != n)
{
printf("Write Error!!\n");
return 0;
}
}
return 0;
}