c语言的 dup函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言的 dup函数相关的知识,希望对你有一定的参考价值。
dup得到的文件描述符用手动关闭吗?FILE *fp=fdopen(dup(fd),"w");这样写时用手动关闭dup出来的文件描述符吗?
你可以这样做,但是没有必要。因为 fd是指向你的打开的文件表项(每个打开的文件都有这么一表项),存在多个fd指向一个表项的情况(如你调用dup2,dup,fcntl),系统采用引用计数的方法,如你有两个fd指向一个文件表现,则计数为2,这样你每次调用close,引用计数减1,减到0是,销毁文件表项以及文件的vnode(inode结构)。即便你不手动关闭文件,进程结束时,系统会自动关闭你打开的文件,所以,试情况而定。有时你可以不必自己close文件。 参考技术A int _dup( int handle ); 为一个已经打开的文件建立第二个句柄。
下面的例子中给已经有句柄的标准输出设备(stdout)建立第二个句柄Monitor ,然后再恢复原来的句柄:
int Monitor; Monitor = _dup(1); ...... _dup2(Monitor,1);
新建的和原有的句柄指的是同一个文件(或设备),该函数不具备关闭文件的功能,因此还需手动关闭。
写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理
实现的时候用到系统原来的dup函数
// mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function // use dup() function when inplementation #include <unistd.h> // include dup() #include <stdio.h> #include <stdlib.h> #define OPEN_MAX 256 /* * when the descriptor is negative or greater than OPEN_MAX, will make a errro * */ int my_dup2(int fd, int newfd); int main(int argc, char *argv[]) { int newfd, return_fd; if (argc != 2) { printf("usage: a.out test.txt\n"); exit(0); } printf("Please input the descriptor than you want to set: "); scanf("%d", &newfd); // open a file int fd = open(argv[1], 0); if (fd == -1) { perror(argv[1]); // print error msg exit(0); } printf("old descriptor is: %d\n", fd); return_fd = my_dup2(fd, newfd); printf("new descriptor is: %d\n"); close(fd); close(return_fd); exit(0); } int my_dup2(int fd, int newfd) { int count = 0; int fdarry[newfd]; // record opened descriptor if (newfd < 0 || newfd > OPEN_MAX) { printf("the new descriptor error!\n"); exit(0); } // dup() return the lowest-numbered available file descriptor if ((fdarry[count] = dup(fd)) == -1) { printf("dup() function error!\n"); exit(0); } else { // test old file descriptor if can be used close(fdarry[count]); } // if fd equals newfd, then dup2 returns newfd without closing it if (fd == newfd) { return fd; } close(newfd); // close // the main implementation for (count = 0; count <= newfd; ++count) { if ((fdarry[count] = dup(fd)) == -1) { printf("dup() funciont error!\n"); exit(0); } else { printf("the descriptor is: %d\n", fdarry[count]); if (fdarry[count] == newfd) { break; } } } for (count = 0; count <= newfd; ++count) { if (fdarry[count] == newfd) { return fdarry[count]; } else { close(fdarry[count]); } } }
以上是关于c语言的 dup函数的主要内容,如果未能解决你的问题,请参考以下文章