目錄
一、基本概念
二、研究進程和被打開文件的關系
(一)w方式
(二)a方式
三、認識系統接口,操作文件
(一)認識文件描述符
(二)舉例
(三)理解文件
一、基本概念
1、所有對文件的操作
- a、對內容操作
- b、對屬性操作
2、內容是數據,屬性也是數據——存儲文件,必須既存儲內容,又存放數據
- 此處的文件,默認就是在磁盤上的文件,加載磁盤上的文件,一定會涉及訪問磁盤設備(由操作系統來做)
3、我們要訪問一個文件的時候,都是要把這個文件先打開
- 訪問的本質:進程要訪問一個文件
- 打開后本質是:將文件加載到內存
4、一個進程可以打開多個文件嗎?多個進程可以打開多個文件嗎?
- 加載到內存,被打開的文件,可能會存在多個
- 進程:打開的文件 = 1 :n(1)
5、根據1和4,操作系統在運行中,可能打開很多個文件,操作系統要不要管理打開的文件呢???需要,如何管理???先描述后組織
?
6、文件按照是否被打開,分成:被打開的文件(在內存),沒有被打開的文件(在磁盤中)
二、研究進程和被打開文件的關系
(一)w方式
- w:以寫的方式打開,如果文件不存在就創建它?
#include<stdio.h>
int main()
{ FILE *fp=fopen("log.txt","w"); if(NULL == fp) { perror("fopen"); return 1; } const char*msg = "hello world\n"; int cnt = 10; while(cnt) { fputs(msg, fp); cnt--; } fclose(fp); return 0;
}
(二)a方式
- a:也是寫入,從文件結尾處開始寫入,不會清空文件,是追加
#include<stdio.h>
int main()
{ FILE *fp=fopen("log.txt","a"); if(NULL == fp) { perror("fopen"); return 1; } const char *msg = "message.txt\n"; fputs(msg,fp); return 0;
}
?
?
三、認識系統接口,操作文件
man 2 open
NAMEopen, creat - open and possibly create a file or deviceSYNOPSIS#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);int creat(const char *pathname, mode_t mode);
-
pathname
: 這是一個字符串,指定要打開或創建的文件的路徑名。它可以是文件的相對路徑或絕對路徑。 -
flags
: 這是一個整數參數,表示打開文件的方式和行為。它可以是以下幾個常見標志的組合:O_RDONLY
:只讀方式打開文件。O_WRONLY
:只寫方式打開文件。O_RDWR
:讀寫方式打開文件。O_CREAT
:如果文件不存在,則創建文件。O_APPEND
:在文件末尾追加內容而不覆蓋原有內容。O_TRUNC
:如果文件存在,并且以寫入方式打開,那么清空文件內容。O_EXCL
:與O_CREAT
一同使用時,如果文件存在則返回錯誤。
-
mode
: 這是一個權限參數,僅在使用O_CREAT
標志時才需要提供。它定義了新創建文件的權限。通常使用八進制表示,比如0644
表示文件所有者具有讀寫權限,其他用戶只有讀權限。 -
返回值:返回一個文件描述符(fd),如果出現錯誤則返回-1
(一)認識文件描述符
#include<stdio.h> #define print1 1 //0001
#define print2 (1<<1) //0010
#define print3 (1<<2) //0100
#define print4 (1<<3) //1000 void print(int flags)
{ if(flags & print1) printf("hello 1\n"); //檢查 flags 中是否包含 print1 對應的標志位if(flags & print2) printf("hello 2\n"); if(flags & print3) printf("hello 3\n"); if(flags & print4) printf("hello 4\n"); else printf("None\n");
}
int main()
{ print(print1); //輸出了 hello 1,因為 print1 代表的標志位被設置 printf("------------\n"); print(print1|print2);//輸出了 hello 1 和 hello 2,因為 print1 和 print2 的標志位都被設置 printf("------------\n"); print(print1|print2 | print3); printf("------------\n"); print(print3|print4); printf("------------\n"); print(print4); return 0;
}
?
(二)舉例
#include <stdio.h>
#include <unistd.h>//close的頭文件
#include <string.h>//strlen的頭文件
//下面三個是open的頭文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int main()
{ umask(0);//更改掩碼 int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0) { perror("open"); return 1; } const char *msg="aaaaa"; write(fd,msg,strlen(msg)); close(fd); return 0;
}
?
?
(三)理解文件
?
?