分类: LINUX
2007-07-04 11:43:29
1.前言
Dup2这个东西着实很讨厌,看了几遍,也用过一遍,在过了一段时间后,竟然又模糊了,因此还是把它写下来吧。
这个函数在系统编程中还是非常重要的。
2.Dup2的官方解释
The dup2 function takes two parameters, fildes and fildes2. It closes entry fildes2 of the file descriptor table if it was open and then copies the pointer of entry fildes into entry fildes2.
SYNOPSIS
#include
int dup2(int fildes, int fildes2);
POSIX
On success, dup2 returns the file descriptor value that was duplicated. On failure, dup2 returns –1 and sets errno. The following table lists the mandatory errors for dup2.
errno |
cause |
EBADF |
fildes is not a valid open file descriptor, or fildes2 is negative or greater than or equal to OPEN_MAX |
EINTR |
dup2 was interrupted by a signal |
3.Dup2的理解
Dup2有两个参数,注意dup2在执行时,首先做的工作是关闭第二个参数fd,也就是说如果第二个参数如果在调用dup2之前是打开的话就会被关闭,如果第二个参数是一个“非打开”的fd,那么dup2就会报错。※非常需要注意的是 :第二个fd的值如果小于0,dup2报错,如果大于1023也会报错,所以,第二个fd的值和linux的系统设置相关,如果超过了一个进程可用打开的最大fd的值,dup2就会报错,所以可以事先使用ulimit来设置linux的可打开fd参数※
然后dup2将指向第一个fd的pointer拷贝到第二个fd,注意,拷贝完成后,第一个fd仍然保留,仍然是可读/写(如果第一个fd以读/写打开的话)。×注意,拷贝的是指针×!!! Dup2执行成功则返回第一个fd的值,失败则返回-1,并设置errno的值。
^_^,dup2执行成功后,如果你不关闭第一个fd,则现在你往第一个fd写东西和往第二个fd写东西效果是一样的了,都是写到第一个fd所指向的文件中去了。
4.结论
这下应该忘不掉了吧。