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,得到并返回一個新的,很像上面的dup2.-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的話,還是不行的,因為只有只讀和在尾部追加的權力,并沒有寫的權力,這個東西規定的死板的。