【Linux系统编程】Linux文件操作
00. 目錄
文章目錄
- 00. 目錄
- 01. 文件描述符
- 02. 常用文件IO函數
- 2.1 open函數
- 2.2 close函數
- 2.3 read函數
- 2.4 write函數
- 03. 案例實戰
- 04. 附錄
01. 文件描述符
在 Linux 的世界里,一切設備皆文件。我們可以使用系統調用中 I/O 的函數(I:input,輸入;O:output,輸出),對文件進行相應的操作( open()、close()、write() 、read() 等)。
打開現存文件或新建文件時,系統(內核)會返回一個文件描述符,文件描述符用來指定已打開的文件。這個文件描述符相當于這個已打開文件的標號,文件描述符是非負整數,是文件的標識,操作這個文件描述符相當于操作這個描述符所指定的文件。
程序運行起來后(每個進程)都有一張文件描述符的表,標準輸入、標準輸出、標準錯誤輸出設備文件被打開,對應的文件描述符 0、1、2 記錄在表中。程序運行起來后這三個文件描述符是默認打開的。
#define STDIN_FILENO 0 //標準輸入的文件描述符#define STDOUT_FILENO 1 //標準輸出的文件描述符#define STDERR_FILENO 2 //標準錯誤的文件描述符在程序運行起來后打開其他文件時,系統會返回文件描述符表中最小可用的文件描述符,并將此文件描述符記錄在表中。Linux 中一個進程最多只能打開 NR_OPEN_DEFAULT (即1024)個文件,故當文件不再使用時應及時調用 close() 函數關閉文件。
02. 常用文件IO函數
2.1 open函數
#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_RDWRmode:這個參數,只有在文件不存在時有效,指新建文件時指定文件的權限 返回值:成功:成功返回打開的文件描述符失敗:-1flags取值:
mode: 這個參數,只有在文件不存在時有效,指新建文件時指定文件的權限
2.2 close函數
#include <unistd.h>int close(int fd); 功能:關閉已打開的文件 參數:fd : 文件描述符,open()的返回值 返回值:成功:0失敗: -1, 并設置errno需要說明的是,當一個進程終止時,內核對該進程所有尚未關閉的文件描述符調用close關閉,所以即使用戶程序不調用close,在終止時內核也會自動關閉它打開的所有文件。
但是對于一個長年累月運行的程序(比如網絡服務器),打開的文件描述符一定要記得關閉,否則隨著打開的文件越來越多,會占用大量文件描述符和系統資源。
2.3 read函數
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count); 功能:把指定數目的數據讀到內存(緩沖區) 參數:fd : 文件描述符buf : 內存首地址count : 讀取的字節個數 返回值:成功:實際讀取到的字節個數失敗: - 12.4 write函數
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count); 功能:把指定數目的數據寫到文件(fd) 參數:fd : 文件描述符buf : 數據首地址 count : 寫入數據的長度(字節) 返回值:成功:實際寫入數據的字節個數失敗: - 103. 案例實戰
實現文件拷貝功能的程序。
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>#define SIZE 128int main(int argc, char **argv) {int fin = -1;int fout = -1;long ret = -1;char buf[SIZE];if (3 != argc){printf("usage: ./a.out filename1 filename2\n"); goto err0;}//以只讀的方式打開一個文件fin = open(argv[1], O_RDONLY);if (-1 == fin){perror("open"); goto err0;}//打開文件fout = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);if (-1 == fout){perror("open"); goto err1;}while(1){memset(buf, 0, SIZE);ret = read(fin, buf, SIZE); if (ret <= 0)break;ret = write(fout, buf, ret);if (ret <= 0)break;}//關閉文件close(fin);close(fout);return 0; err2:close(fout); err1:close(fin); err0:return -1; }編譯和測試
04. 附錄
4.1 測試代碼下載:
總結
以上是生活随笔為你收集整理的【Linux系统编程】Linux文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】Qt数据库驱动层
- 下一篇: 【Linux系统编程】文件描述符的复制d