复制文件描述符,dup函数详细说明及用法,dup2函数详细说明及用法(文件IO)【linux】(k)

只谈情不闲聊 提交于 2020-02-04 02:20:45

dup函数详细说明及用法,dup2函数详细说明及用法

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!