1. 檔案系統:用來存盤、組織、管理檔案的一套方式、協議
2. 檔案
- 檔案的屬性:i-node唯一表示一個檔案的存在與否
- 檔案的內容
3. Linux系統如何實作檔案的操作?

硬體層:
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被設定
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/508034.html
標籤:Linux
上一篇:Nginx幾種負載均衡方式介紹
下一篇:正則運算式
