基於文件描述符的文件操作(非緩沖)
1、文件描述符
內核為每個進程維護一個已打開文件的記錄表,文件描述符是一個較小的正整數(0—1023),它代表記錄表的一項,通過文件描述符和一組基於文件描述符的文件操作函數,就可以實現對文件的讀、寫、創建、刪除等操作。常用基於文件描述符的函數有
open(打開)
、creat(創建)、close(關閉)、read(讀取)、write(寫入)、ftruncate(改變文件大小)、lseek(定位)、fsync(同步)、fstat(獲取文件狀態)、fchmod(權限)、flock(加鎖)、fcntl(控制文件屬性)、dup(復制)、dup2、select和ioctl。基於文件描述符的文件操作並非ANSI C的函數,是LINUX獨有的東西。
如果不清楚某個函數的具體實現形式,可以通過下面的方式查詢
man 函數名 查看該函數的幫助
|
||||||||||||||||||||||||||||||||||||
2、打開、創建和關閉文件
open和creat都能打開和創建函數,原型為
#include <sys/types.h> //頭文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //文件名 打開方式
int open(const char *pathname, int flags, mode_t mode); //文件名 打開方式 權限,open()函數出錯時返回-1
int creat(const char *pathname, mode_t mode); //文件名 權限 //現在已經不常用了(因為有上面的函數)
creat函數等價於→open(pathname,O_CREAT|O_TRUNC|O_WRONLY,mode);
flags和mode都是一組掩碼的合成值,flags表示打開或創建的方式,
必須加上打開方式
,mode表示文件的訪問權限。
|
||||||||||||||||||||||||||||||||||||
flags的可選項有:
|
||||||||||||||||||||||||||||||||||||
mode的可選項有:
但是通常采用
直接賦數值
的形式,如:
int fd=open(argv[1],O_CREAT|O_RDONLY,0666);
注意:LINUX中基於文件描述符的 open 函數,對於一個不存在的文件,不能通過 O_WRONLY 的方式打開,必須加上 O_CREAT 選項。
close用於文件的關閉:
int close(int fd);
//fd表示文件描述詞,是先前由open或creat創建文件時的返回值
。
文件使用完畢后,應該調用close關閉它,
一旦調用close,則該進程對文件所加的鎖全都被釋放,並且使文件的打開引用計數減1,只有文件的打開引用計數變為0以后,文件才會被真正的關閉
。
|
//o_creat.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char ** argv)
{
int fd = open(argv[1],O_CREAT|O_RDONLY,0666);
printf("ret = %d\n",ret);
close(fd);
return 0;
}
|
//(創建文件默認減去掩碼0002) |
open 函數中的fiags (O_RDWR|O_CREAT|O_EXCL)表示在創建文件時不確定系統有沒有人創建過這個文件,就加上O_EXCL,表示如果系統存在相應文件就強制失敗