date 2020-08-03
檔案控制
#include<fcntl.h>
int fcntl (int fd ,int cmd,…);
1.複制檔案描述符
int fcntl(int oldfd,F_DUPFD,newfd);
成功傳回目标檔案描述符(可能為newfd),失敗傳回-1
oldfd:源檔案描述符
newfd: 目标檔案描述符
fcntl函數在複制oldfd參數所辨別的源檔案描述符表項時,會先檢查由newfd參數所辨別的的目标檔案描述符表項是否空閑,若空閑将前者複制給後者,否則并不會将其關閉,而是找另一個空閑的檔案描述符作為複制目标
示例代碼 fcntl.c
/*
date 2020-08-03
name fcntl.c
version 1.0
*/
#include<stdio.h>
#include<unistd.h>
2.擷取/設定檔案描述标志
int fcntl(int fd,F_SETFD,int flags);
成功傳回0,失敗傳回-1
示例代碼 fd.c
/*
date 2020-08-05
name fd.c
version 1.0
*/
#include<stdio.h>
#include<fcntl.h>
int main(void) {
int fd = open("fd.txt",O_RWDR | O_CREAT | O_TRUNC,0644);
if(-1 == fd){
perror("open");
return = -1;
}
int flags = fcntl(fd,F_GETFD);
if(-1 == flags) {
perror("fcntl");
return -1;
}
printf("檔案描述符标志:%08x\n",flags);
if(flags & FD_CLOEXE)
printf("檔案描述符%d将在新程序中被關閉。\n",fd);
else
printf("檔案描述符%d将不會在新程序中關閉。\n",fd);
if(fcntl(fd,F_SETFD,flags | FD_CLOEXEC) == -1) {
perror("fcntl");
return -1;
}
if((flags = fcntl(fd,F_GETFD) == -1) {
perror("fcntl");
return -1
}
printf("檔案描述符标志:%08x\n",flags);
if(flags & FD_CLOEXE)
printf("檔案描述符%d将在新程序中被關閉。\n",fd);
else
printf("檔案描述符%d将不會在新程序中關閉。\n",fd);
close(fd);
return 0 ;
}
檔案鎖
1.讀寫沖突
a.寫沖突:如果有兩個或兩個以上的程序“同時”向一個檔案的某個特定區域寫資料,那麼最後寫入檔案的資料極有可能因為寫交錯而産生混亂
b.讀沖突:如果一個程序寫而其他程序同時讀一個檔案的某個特定區域,那麼讀出來的資料極有可能因為讀寫操作的交錯而不完整。
c.讀共享:多個程序同時讀一個檔案的某個特定區域,不會有任何問題,它們隻是各自把檔案中的資料拷貝到各自的緩沖區去,并不會改變檔案的内容,是以也就不會影響到彼此。