dup函数
函数原型
include <unistd.h>
int dup(int oldfd);
功能
复制某个已经打开的文件描述符,得到一个新的描述符,这个新的描述符,也指向被复制描述符所指向的文件。
比如:4指向了某个文件,从4复制出5,让5也指向4指向的文件。
至于需要用到的新描述符,dup会使用描述符池(0~1023)中当前最小没用的那一个。
返回值
成功:返回复制后的新文件描述符
失败:返回-1,并且errno被设置。
参数
oldfd:会被复制的、已经存在的文件描述符。
代码演示
我们先来看以下这两个文件描述符的值。
代码为:
执行结果为:
那么我们看到新的文件描述符为3和4, 因为当文件打开的时候012已经被使用,open的时候文件描述符池中最小的没有被使用是3,dup复制出新的文件描述符继续使用文件描述符中最小的没有被使用的4。
由于是赋值所以两个文件描述符指向同一个文件:
那么接下来我们查看使用这两个文件描述符能不能向同一个文件写入数据:
执行结果为:
我们可以看到写入成功了。
dup2函数
函数原型
#include <unistd.h>
int dup2(int oldfd, int newfd);
功能
功能同dup,只不过在dup2里面,我们可以自己指定新文件描述符。
如果这个新文件描述符已经被打开了,dup2会把它给关闭后,再使用。
例如:
dup(2, 3);
从2复制出3,让3也指向2所指向的文件,如果3之前被打开过了,dup2会关闭它,然后在使用。
dup2和dup的不同之处在于:
dup:自己到文件描述符池中找新文件描述符
dup2:我们可以自己指定新文件描述符
返回值
成功:返回复制后的新文件描述符
失败:返回-1,并且errno被设置。
参数
oldfd:会被复制的、已经存在的文件描述符。
newfd:新的文件描述符
接下来我们通过代码进行演示:
执行结果为:
我们可以看到fd2就是我们指定的文件描述符6
来源:CSDN
作者:熟练的初学者
链接:https://blog.csdn.net/qq_43648751/article/details/104154985