dup和dup2都是复制文件描述符的函数。作用像指向某个文件流的指针。但是文件描述符的值又像int那样直观。所以有时候如果直接赋值,其实是没有多大效果的。
在uulp中(understand unix/linux programming)中第329页给出了一个dup函数的使用案例:
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define CLOSE_DUP
//#define USE_DUP2
int main(){
int fd;
//int newfd;
char line[100];
fgets(line ,100, stdin); printf("%s",line);
fgets(line ,100, stdin); printf("%s",line);
fgets(line ,100, stdin); printf("%s",line);
fd = open("data", O_RDONLY);
#ifdef CLOSE_DUP
close(0);
//printf("fd=%d\n",fd);
newfd = dup(fd);
printf("newfd = %d\n",newfd);
#else
printf("fd = %d\n",fd);
newfd = dup2(fd,0);
printf("newfd = %d\n",newfd);
#endif
if(newfd != 0){
fprintf(stderr, "Could not duplicate fd to 0\n");
exit(1);
}
fgets(line ,100, stdin); printf("%s",line);
fgets(line ,100, stdin); printf("%s",line);
fgets(line ,100, stdin); printf("%s",line);
return 0;
}
上面这个程序首先从标准输入获取三行,然后关闭标准输入文件描述符0,然后把打开data文件的文件描述符复制为0,这样就把标准输入重定向到data文件。然后最后三行代码从data文件获取三行输入。
测试结果:
abd
abd
ekd
ekd
loi
loi
fd = 3
newfd = 0
1234566444 3874732
1237 328318 443.223
19384 54030 0504045 1234566444 3874732
这里我做了一个实验。就是把newfd直接赋值为0,而不是通过dup函数复制,结果发现是没有用的,这样做的后果是不会发生重定向,最后三行是从前面buf中最后的数据输出了三遍。
abc
abc
ifj
ifj
atlast
atlast
fd=0
atlast
atlast
atlast
然后找到了一片kernel源码分析的文章,在这里做个保存