日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux系统编程】Linux文件操作

發(fā)布時(shí)間:2024/4/24 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux系统编程】Linux文件操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 文件描述符
    • 02. 常用文件IO函數(shù)
      • 2.1 open函數(shù)
      • 2.2 close函數(shù)
      • 2.3 read函數(shù)
      • 2.4 write函數(shù)
    • 03. 案例實(shí)戰(zhàn)
    • 04. 附錄

01. 文件描述符

在 Linux 的世界里,一切設(shè)備皆文件。我們可以使用系統(tǒng)調(diào)用中 I/O 的函數(shù)(I:input,輸入;O:output,輸出),對文件進(jìn)行相應(yīng)的操作( open()、close()、write() 、read() 等)。

打開現(xiàn)存文件或新建文件時(shí),系統(tǒng)(內(nèi)核)會(huì)返回一個(gè)文件描述符,文件描述符用來指定已打開的文件。這個(gè)文件描述符相當(dāng)于這個(gè)已打開文件的標(biāo)號,文件描述符是非負(fù)整數(shù),是文件的標(biāo)識,操作這個(gè)文件描述符相當(dāng)于操作這個(gè)描述符所指定的文件。

程序運(yùn)行起來后(每個(gè)進(jìn)程)都有一張文件描述符的表,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備文件被打開,對應(yīng)的文件描述符 0、1、2 記錄在表中。程序運(yùn)行起來后這三個(gè)文件描述符是默認(rèn)打開的。

#define STDIN_FILENO 0 //標(biāo)準(zhǔn)輸入的文件描述符#define STDOUT_FILENO 1 //標(biāo)準(zhǔn)輸出的文件描述符#define STDERR_FILENO 2 //標(biāo)準(zhǔn)錯(cuò)誤的文件描述符

在程序運(yùn)行起來后打開其他文件時(shí),系統(tǒng)會(huì)返回文件描述符表中最小可用的文件描述符,并將此文件描述符記錄在表中。Linux 中一個(gè)進(jìn)程最多只能打開 NR_OPEN_DEFAULT (即1024)個(gè)文件,故當(dāng)文件不再使用時(shí)應(yīng)及時(shí)調(diào)用 close() 函數(shù)關(guān)閉文件。

02. 常用文件IO函數(shù)

2.1 open函數(shù)

#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); 功能:打開文件,如果文件不存在則可以選擇創(chuàng)建。 參數(shù):pathname:文件的路徑及文件名flags:打開文件的行為標(biāo)志,必選項(xiàng) O_RDONLY, O_WRONLY, O_RDWRmode:這個(gè)參數(shù),只有在文件不存在時(shí)有效,指新建文件時(shí)指定文件的權(quán)限 返回值:成功:成功返回打開的文件描述符失敗:-1

flags取值:


mode: 這個(gè)參數(shù),只有在文件不存在時(shí)有效,指新建文件時(shí)指定文件的權(quán)限

2.2 close函數(shù)

#include <unistd.h>int close(int fd); 功能:關(guān)閉已打開的文件 參數(shù):fd : 文件描述符,open()的返回值 返回值:成功:0失敗: -1, 并設(shè)置errno

需要說明的是,當(dāng)一個(gè)進(jìn)程終止時(shí),內(nèi)核對該進(jìn)程所有尚未關(guān)閉的文件描述符調(diào)用close關(guān)閉,所以即使用戶程序不調(diào)用close,在終止時(shí)內(nèi)核也會(huì)自動(dòng)關(guān)閉它打開的所有文件。

但是對于一個(gè)長年累月運(yùn)行的程序(比如網(wǎng)絡(luò)服務(wù)器),打開的文件描述符一定要記得關(guān)閉,否則隨著打開的文件越來越多,會(huì)占用大量文件描述符和系統(tǒng)資源。

2.3 read函數(shù)

#include <unistd.h>ssize_t read(int fd, void *buf, size_t count); 功能:把指定數(shù)目的數(shù)據(jù)讀到內(nèi)存(緩沖區(qū)) 參數(shù):fd : 文件描述符buf : 內(nèi)存首地址count : 讀取的字節(jié)個(gè)數(shù) 返回值:成功:實(shí)際讀取到的字節(jié)個(gè)數(shù)失敗: - 1

2.4 write函數(shù)

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count); 功能:把指定數(shù)目的數(shù)據(jù)寫到文件(fd) 參數(shù):fd : 文件描述符buf : 數(shù)據(jù)首地址 count : 寫入數(shù)據(jù)的長度(字節(jié)) 返回值:成功:實(shí)際寫入數(shù)據(jù)的字節(jié)個(gè)數(shù)失敗: - 1

03. 案例實(shí)戰(zhàn)

實(shí)現(xiàn)文件拷貝功能的程序。

#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;}//以只讀的方式打開一個(gè)文件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;}//關(guān)閉文件close(fin);close(fout);return 0; err2:close(fout); err1:close(fin); err0:return -1; }

編譯和測試

04. 附錄

4.1 測試代碼下載:

總結(jié)

以上是生活随笔為你收集整理的【Linux系统编程】Linux文件操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。