分类: C/C++
2014-04-14 10:57:30
dup:
输入: oldfd -- 现存的文件描述符输出:无
dup2
输入: oldfd -- 现存的文件描述符 newfd -- 复制到的文件描述符
输出:无
dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。 dup:复制一个现存的文件描述符oldfd,返回一个新的文件描述符
dup2:复制oldfd文件描述符到newfd
例:
-
#include <unistd.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
int main(void)
-
{
-
int fd, save_fd;
-
char msg[] = "This is a test of dup() & dup2()\n";
-
int test;
-
fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
-
if(fd<0) {
-
perror("open");
-
exit(1);
-
}
-
save_fd = dup(STDOUT_FILENO); //运行后save_fd指向STDOUT_FILENO,即save_fd指向标准输出
-
printf("save_fd=%d\n",save_fd); //测试用
-
test=dup2(fd, STDOUT_FILENO); //运行后STDOUT_FILENO指向fd所指向的文件,即STDOUT_FILENO指向somefile
-
printf("dup2_1=%d\n",test); //测试用 此时的标准输出不再指向显示器,因此该段测试将写入somefile文件中
-
close(fd);
-
write(STDOUT_FILENO, msg, strlen(msg)); //此时STDOUT_FILENO所指向的是somefile文件不再是标准输出流,因此该段将
-
//写入somefile文件中
-
test=dup2(save_fd, STDOUT_FILENO); //运行后STDOUT_FILENO指向save_fd所指向的文件,即标准输出流
-
printf("dup2_2=%d\n",test); //测试用 此时标准输出流重新指回显示器,因此该段测试将写入显示器
-
write(STDOUT_FILENO, msg, strlen(msg)); //此时STDOUT_FILENO所指向的便回标准输出流该段将写入显示器
-
close(save_fd);
-
return 0;
-
}
编译并运行
[linux@localhost daemon]$ gcc -o dup_test dup_test.c
[linux@localhost daemon]$ ./dup_test
save_fd=4
dup2_2=1
This is a test of dup() & dup2()