1. 文件系統:用來存儲、組織、管理文件的一套方式、協議 2. 文件 文件的屬性:i-node唯一表示一個文件的存在與否 文件的內容 3. Linux系統如何實現文件的操作? 硬體層: inode(屬性) >文件的內容 Linux內核: struct inode{}用來描述一個文件的屋裡inode的 ...
1. 文件系統:用來存儲、組織、管理文件的一套方式、協議
2. 文件
- 文件的屬性:i-node唯一表示一個文件的存在與否
- 文件的內容
硬體層:
inode(屬性)--->文件的內容
Linux內核:
struct inode{}用來描述一個文件的屋裡inode的信息【鏈表保存】,系統識別到一個文件的存在,
就會為它創建一個struct inode,一個文件只會唯一對應一個struct inode
struct file{}用來描述一個已經打開的文件:
文件狀態標記(如:O_RDONLY、O_WRONLY......)
文件的偏移量/offset(類似“游標”)
struct inode*
每一個打開的文件都會對應一個struct file
一個文件可以被多個不同的進程打開,一個進程也可以打開多個文件
操作文件的過程:
struct file---> struct inode--->硬體上面的inode--->文件的內容
linux為了屏蔽文件操作的具體細節,為每一個進程創建一個“進程文件表項”,
保存每一個進程打開的文件的 struct file* 的數組
struct file*fds[]
0 struct file*--->struct inode......
1 struct file*--->struct inode......
......
linux再提供操作文件的函數介面:
fd = open()
打開一個指定的文件,返回“進程文件表項”的下標,
int "文件描述符":在linux應用中,用來描述一個已經打開的文件,每一個打開的文件都有有個唯一的id,
後續操作這個文件,都是通過這個id操作該文件
read(fd)
write(fd)
close(fd)
......
linux系統提供的這些用於操作文件的介面函數(open,read.....),我們稱為“系統IO”
系統IO:操作系統提供的對文件的輸入輸出的介面
4. Linux系統IO的使用
文件的操作步驟
- 打開文件 open()
NAME
open, openat, creat - open and possibly create a file
打開或者創建(創建並打開)一個文件
SYNOPSIS
#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);
pathname:要打開或者創建的文件名,帶路徑(不帶路徑表示當前路徑)
flags:打開文件的標記
O_RDONLY:只讀
O_WRONLY:只寫
O_RDWR:讀寫
以上三個標記只能選一個(文件的打開方式)
O_APPEND:追加標記,打開文件後,文件的偏移量會在文件的末尾。(預設情況下,讀和寫的標記在文件的開頭)
O_CREAT:創建標記,如果不存在,則創建文件
O_EXCL:該標記一般和O_CREAT配合使用,用來測試文件是否存在
如果指定O_CREAT | O_EXCL,並且文件存在,則open會失敗,並且errno設置為EEXIST,表示文件已存在
O_TRUNC:truncate 截短,清除文件內容
O_NONBLOCK:非阻塞方式打開文件
非阻塞:不等待
如果文件沒有內容,read不會等待,直接返回一個錯誤
如果文件沒有空間了,write不會阻塞,直接返回一個錯誤
阻塞:等待
如果文件沒有內容,read會等待(直到有數據或出錯)
如果文件沒有空間了,write會阻塞,(直到有空間或出錯)
。。。。。。
多個標記使用“|”鏈接(標記是使用位域實現的)
O_RDWR | O_CREAT | O_TRUNC
mode:指定創建的文件的許可權,當第二個參數帶有O_CREAT時,指定創建的文件的許可權
返回值:成功打開一個文件,返回打開文件的文件描述符(>2 && int(下標))
操作系統會自動為每一個進程打開三個文件:
標準輸入文件:文件描述符 STDIN_FILENO (0)
標準輸出文件:文件描述符 STDOUT_FILENO (1)
標準出錯文件:文件描述符 STDERR_FILENO (2)
失敗返回-1,同時errno被設置
errno是一個全局變數,是用來保存最後一個出錯的錯誤碼
頭文件: #include<srrno.h>
路徑:/usr/include/errno.h
perror 把錯誤碼對應的錯誤字元串列印出來
perro("user indi");
user indi:用戶自己的提示信息
列印出來的形式:用戶自己的提示信息:系統錯誤碼的提示信息
int creat(const char *pathname, mode_t mode);
//open.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char argv*[])
{
//打開文件
int fd=open(argv[1],O_RDWR, 0666);
if(-1 == fd)
{
printf("open %s error\n",argv[1]);
//解析errno
perror("open error");
return -1;
}
peintf("open success\n");
peintf("fd = %d\n",fd);
//關閉文件
close(fd)q;
retrun 0;
}
- 對文件的操作(讀、寫...)
- 關閉文件
NAME
close - close a file descriptor
SYNOPSIS
#include <unistd.h>
int close(int fd);
close是用來關閉fd指定的文件
fd:file descriptor 文件描述符
返回值:
成功:返回0
失敗:返回-1,同時errno被設置