文件描述符的复制与重定向
- 文件描述符的复制和重定向
- (1)概述
- (2)dup
- (2)dup2
- (3)fcntl
文件描述符的复制和重定向
(1)概述
文件描述符的复制
创建一个新的文件描述符,该文件描述符指向旧文件描述符所指向的文件
文件描述符的重定向
对已有的文件描述符所指向的文件进行”重新绑定"
(2)dup
该函数用于对文件描述符的复制,复制得到的文件描述符和原文件描述符同指向一个文件(或设备)
#include <unistd.h>
int fdNew = dup(fdOld);
- fdOld:被复制的文件描述符
- return:调用成功则返回的文件描述符;-1表示复制失败
注意:fdNew是新创建出来的文件描述符,这是区别于文件描述符重定向的主要矛盾
(2)dup2
该函数可以实现文件描述符的复制,也可以实现文件描述符的创建
#include <unistd.h>
int dup2(int fd_old, int fd_new);
- fd_old:被复制文件描述符或重定向的目标文件描述符
- fd_new:同样接管fd_old所指向的文件的文件描述符,当fd_new没有接管文件时,该函数用于复制文件描述符;当fd_new已经接管了某一个文件时,该函数用于重定向文件描述符
- return:成功则返回新的文件描述符,失败返回-1
(3)fcntl
该函数可以实现多种功能:文件描述符的复制、获取文件属性、设置文件属性等
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ...);
- fd:要操作的文件描述符
- cmd:功能参数(F_DUPFD:复制一个已经存在的文件描述符);(F_GETFL:获取文件的状态);(F_SETFL:设置文件的状态)
- return:F_DUPFD则返回复制出来的文件描述符;F_GETFL则返回文件的属性信息;F_SETFL对应返回非负数则成功,负数表示失败
举例:设置文件的状态标志
// 得到文件的flag属性
int iFlag = fcntl(fd, F_GETFL);
// 添加新的flag 标志
iFlag = iFlag | O_APPEND;
// 将更新后的falg设置给文件
fcntl(fd, F_SETFL, iFlag );