dup
#include<unistd.h>
int dup(int oldfd);
作用:复制一个新的文件描述符
fd = 3, int fd1 = dup(fd);
f指向的是a.txt,fd1指向的也是a.txt
从空闲的文件描述符表中找一个最小的作为新的拷贝的文件描述符
返回:成功返回新的文件描述符,失败返回-1
dup2
#include<unistd.h>
int dup2(int oldfd, int newfd);
作用: 重定向文件描述符
oldfd指向1.txt,newfd原本指向2.txt
调用成功后,newfd和b.txt自动做close,同时newfd指向了a.txt
如果old和new的值相同,是同一个文件描述符,相当于上面都没做
返回:成功返回新的文件描述符,失败返回-1
fcntl
有五种用法,常用的两种
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
参数:
fd:需要被操作的文件描述符
cmd:表示对文件描述符如何操作的命令
1.
-F_DUPFD : 复制文件描述符,复制fd,得到并返回一个新的,很像上面的dup
2.
-F_GETFL : 获取指定的文件描述符的flag,就是O_RDONLY这样的
-F_SETFL : 设置文件描述符文件状态flag
必选项: O_RDONLY,O_WRONLY,O_RDWR 不可以被修改
可选项: O_APPEND表示追加数据, O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK设置成阻塞
阻塞和非阻塞:描述的是函数调用的行为
eg:第二种改写文件描述符状态的操作示例
//假设一开始打开的时候,传入的文件描述符状态是只写状态
int fd = open("1.txt",O_WRONLY);
if(fd == -1){
perror("open");
return -1
}
//获取当前文件描述符的状态flag
int flag = fcntl(fd, F_GETFL);
flag += O_APPEND;
//修改文件描述符状态的flag,给falg变成上面修改的新的flag
int ret = fcntl(fd,F_SETFL, flag);
char* str = "nihao";
write(fd,str,strlen(str));
close(fd);
//这样nihao就可以添加在后面了,这就达到了修改的目的
如果一开始传入的是O_RDONLY,然后后面再加上O_APPEND的话,还是不行的,因为只有只读和在尾部追加的权力,并没有写的权力,这个东西规定的死板的。