dup和dup2函数:复制文件描述符
1. 文件描述符表(fd的标号),其中0,1,2默认被占用。
2. 复制文件描述符指:复制后产生的两个文件描述符可以操作同一个文件
3. 函数原型:
a. int dup(int oldfd);
dup会将oldfd复制一份到当前文件描述符表中未被占用的最小的文件描述符上
-- 返回值为复制的文件描述符
b. int dup2(int oldfd, int newfd);
dup2指定了复制到的新的文件描述符:
-- 当新文件描述符被打开时,dup2会关闭它,然后将old复制给它
-- 当old与new为同一文件描述符,dup2返回为oldfd
4. 文件关闭
复制之后需要关闭两个文件描述符才会真正关闭文件
fcntl函数:改变已经打开文件的属性
1. 函数原型:
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
2. 函数作用:
a. 复制一个文件描述符
b. 获得/设置文件描述符标记 -- F_GETFD/F_SETFD
c. 获得/设置文件状态标记 -- F_GETFL/F_SETFL
F_GETFL:O_RDONLY, O_WRONLY, O_RDWR, O_EXEC, O_SEARCH, O_APPEND, O_NONBLOCK
F_SETFL:O_APPEND<追加写操作>, O_NONBLOCK
-- 追加写只能在原文件打开时有写权限才能设置
d. 获得/设置异步I/O所有权 -- F_GETWN/F_SETWN
e. 获得/设置记录锁 -- F_GETK/F_SETK/F_SETKW
3. 参数与返回值
fd:文件描述符
cmd:F_GETxx或者F_SETxx
arg:如果cmd为GET时,值设置0;如果为SET时,为SET的可选内容参数
追加操作 flag |= O_APPEND
返回值:如果cmd为GET时,返回值为文件的描述信息