天天看點

C/C++學習筆記——檔案操作(三)

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.讀共享:多個程序同時讀一個檔案的某個特定區域,不會有任何問題,它們隻是各自把檔案中的資料拷貝到各自的緩沖區去,并不會改變檔案的内容,是以也就不會影響到彼此。