国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】文件周邊001之系統(tǒng)文件IO

這篇具有很好參考價值的文章主要介紹了【Linux】文件周邊001之系統(tǒng)文件IO。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux

??樊梓慕:個人主頁

???個人專欄:《C語言》《數(shù)據(jù)結(jié)構(gòu)》《藍橋杯試題》《LeetCode刷題筆記》《實訓項目》《C++》《Linux》《算法》

??每一個不曾起舞的日子,都是對生命的辜負


目錄

前言

1.C語言文件IO

1.1C語言文件IO接口匯總?

1.2當前路徑指的是什么?

?1.3stdin、stdout、stderr

2.系統(tǒng)文件IO

2.1open

參數(shù)const char* pathname

參數(shù)int flags

*位圖方式傳參

參數(shù)mode_t mode

返回值int fd『 簡要理解文件描述符』

2.2close

2.3write?

2.4read


前言

進程周邊的相關(guān)內(nèi)容暫時告一段落,下面我們開始學習文件部分。

學習『 系統(tǒng)文件IO』之前,我會與大家先復習一下C語言部分文件IO的相關(guān)接口,為后面的學習作『 鋪墊』。系統(tǒng)文件IO部分,本篇文章會講解『 基本的系統(tǒng)調(diào)用』:open()、close()、read()、write(),有關(guān)參數(shù)傳遞涉及到『 位圖方式傳遞』,這部分以前沒有學習過,博主也會拿出來簡單的學習一下。


歡迎大家??收藏??以便未來做題時可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================文章來源地址http://www.zghlxwxcb.cn/news/detail-821074.html

GITEE相關(guān)代碼:??fanfei_c的倉庫??

=========================================================================


1.C語言文件IO

1.1C語言文件IO接口匯總?

在學習C語言期間,我們學習過一些C語言封裝的文件接口:

C語言文件接口匯總
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 打開文件
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 關(guān)閉文件
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 寫入一個字符
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 讀取一個字符
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 寫入一個字符串
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 讀取一個字符串
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 格式化寫入數(shù)據(jù)
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 格式化讀取數(shù)據(jù)
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 向二進制文件寫入數(shù)據(jù)
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 從二進制文件讀取數(shù)據(jù)
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 設(shè)置文件指針的位置
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 計算當前文件指針相對于起始位置的偏移量
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 設(shè)置文件指針到文件的起始位置
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 判斷文件操作過程中是否發(fā)生錯誤
【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux 判斷文件指針是否讀取到文件末尾

本篇文章不會完全的講解以上C語言文件接口,想要詳細了解的同學可以『 點擊以下內(nèi)容』跳轉(zhuǎn)到博主的有關(guān)C語言文件IO的博客。

『 樊梓慕』文件操作——CSDN

1.2當前路徑指的是什么?

當我們利用C語言IO接口創(chuàng)建文件時,生成的文件默認在『 當前路徑』,可當前路徑具體指的是誰的路徑呢?

  • 『 文件是由進程創(chuàng)建』,所以文件的當前路徑也是進程的當前路徑。

在之前學習進程的部分,我們已經(jīng)聊過有關(guān)話題,當前路徑指的是進程在啟動時,會保存當前目錄的路徑,保存到『 /proc/[pid]/cwd』中,該路徑就是進程的當前路徑。

【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux


?1.3stdin、stdout、stderr

在之前學習時,我們提到過一個概念:『 Linux下一切皆文件』 ,也就是說鍵盤、顯示器都是文件,這很好理解,我們向普通文件寫入,本質(zhì)上就是向磁盤寫入數(shù)據(jù),那將對象改為顯示器,是不是就是打印了?

但是,向文件寫入我們一般這么操作:

FILE* fp = fopen("log.txt", "w");
fputs("hello world\n", fp);

可是打印我們從未『 打開』顯示器文件,也從未『 傳遞』過流參數(shù):

printf("hello world\n");

這也就說明了:

進程在運行的時候都會『 默認打開』三個輸入輸出流,即標準輸入流、標準輸出流以及標準錯誤流,對應(yīng)到C語言當中就是stdin、stdout以及stderr。

其中,標準輸入流對應(yīng)的設(shè)備就是鍵盤,標準輸出流和標準錯誤流對應(yīng)的設(shè)備都是顯示器。

所以,我們想要實現(xiàn)打印的功能,也可以這樣寫:

fputs("hello world\n", stdout);

stdin、stdout以及stderr是C標準庫下的標準輸入輸出錯誤流,其他語言如C++也有對應(yīng)的標準輸入輸出錯誤流:cin、cout和cerr。


2.系統(tǒng)文件IO

?C程序可以直接對硬件進行寫入么?

在之前學習的時候,關(guān)于操作系統(tǒng)我們有過這樣一張圖:

【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux

什么意思?

程序不可能也不可以越過操作系統(tǒng)直接操作硬件,還記得『 系統(tǒng)調(diào)用』么?

?也就是說C標準庫中的文件IO接口一定『 封裝了系統(tǒng)調(diào)用』,所以才能利用fopen()、fputs()等函數(shù)對文件進行操作。

那接下來我們就來學習文件IO的系統(tǒng)調(diào)用。

2.1open

?open是打開文件的系統(tǒng)調(diào)用接口。

int open(const char *pathname, int flags, mode_t mode);

參數(shù)const char* pathname

代表要打開或創(chuàng)建的目標文件。?

  • 若pathname以路徑的方式給出,則當需要創(chuàng)建該文件時,就在pathname路徑下進行創(chuàng)建。
  • 若pathname以文件名的方式給出,則當需要創(chuàng)建該文件時,默認在當前路徑下進行創(chuàng)建。

參數(shù)int flags

代表文件的打開方式。

參數(shù) 含義
O_RDONLY 以只讀的方式打開文件
O_WRNOLY 以只寫的方式打開文件
O_APPEND 以追加的方式打開文件
O_RDWR 以讀寫的方式打開文件
O_CREAT 當目標文件不存在時,創(chuàng)建文件

傳遞方式介紹:

例如:以只寫的方式打開文件,當目標文件不存在時自動創(chuàng)建文件,則參數(shù)設(shè)置如下:

O_WRONLY | O_CREAT

為什么這么傳遞??

*位圖方式傳參

?先寫一段代碼:

#define ONE 1
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)
#define FIVE (1<<4)

void Print(int flag)
{
    if(flag & ONE) printf("1\n");
    if(flag & TWO) printf("2\n");
    if(flag & THREE) printf("3\n");
    if(flag & FOUR) printf("4\n");
    if(flag & FIVE) printf("5\n");
}

int main()
{
    Print(ONE);
    printf("----------------------\n");
    Print(TWO);
    printf("----------------------\n");
    Print(ONE|TWO);
    printf("----------------------\n");
    Print(THREE|FOUR|FIVE);
    printf("----------------------\n");
    Print(ONE|TWO|THREE|FOUR|FIVE);
}

?根據(jù)代碼中的宏定義,這些宏的特點就是所有位加起來只有一個1。?

?Print函數(shù)中五個if中的判斷條件其實就是判斷參數(shù)哪個位為1,如果傳的是ONE,那么ONE與ONE&得到的就是1,為真就打印1,其余的都為假,不打印。

當帶上|操作符后,相當于把兩個參數(shù)的1位合并到一起,比如ONE|TWO得到的就是0011,所以在Print中就會滿足兩個條件flag & ONE 和 flag & TWO。

【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux

這就是位圖方式傳參的基本思想。


放到flags中呢?

#define O_RDONLY       0000
#define O_WRONLY       0001
#define O_RDWR         0010
#define O_CREAT        0100

之后通過&運算:

int open(arg1, arg2, arg3){
	if (arg2&O_RDONLY){
		//設(shè)置了O_RDONLY選項
	}
	if (arg2&O_WRONLY){
		//設(shè)置了O_WRONLY選項
	}
	if (arg2&O_RDWR){
		//設(shè)置了O_RDWR選項
	}
	if (arg2&O_CREAT){
		//設(shè)置了O_CREAT選項
	}
	//...
}

所以如果arg2=O_CREAT |?O_WRONLY,即arg2=0101,arg2 &?O_WRONLY =1 && arg2 &?O_CREAT =1就達到了『 以只寫的方式打開文件,當目標文件不存在時自動創(chuàng)建文件』的目的。

這就是『 位圖方式傳參』。

參數(shù)mode_t mode

代表創(chuàng)建文件的默認權(quán)限。

例如:將mode設(shè)置為0666,則創(chuàng)建出來的文件權(quán)限如下:

-rw-rw-rw-

但『 實際上』創(chuàng)建出來文件的權(quán)限值還會受到umask(文件默認掩碼)的影響。

實際創(chuàng)建出來文件的權(quán)限為:mode減去對應(yīng)位的umask值。

umask的默認值默認為0002,所以當我們設(shè)置mode值為0666時實際創(chuàng)建出來文件的權(quán)限為0664。

若想創(chuàng)建出來文件的權(quán)限值不受umask的影響,則需要在創(chuàng)建文件前使用umask函數(shù)將文件默認掩碼設(shè)置為0。

umask(0); //將文件默認掩碼設(shè)置為0

如果不需要創(chuàng)建新的文件,則使用兩個參數(shù)的open即可。?

返回值int fd『 簡要理解文件描述符』

代表打開文件的『 文件描述符』。

  • fd>0:返回的是文件描述符。
  • fd==-1:代表打開文件失敗。

一個進程可以打開多個文件:????????

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int main()
{
	umask(0);
	int fd1 = open("log1.txt", O_RDONLY | O_CREAT, 0666);
	int fd2 = open("log2.txt", O_RDONLY | O_CREAT, 0666);
	int fd3 = open("log3.txt", O_RDONLY | O_CREAT, 0666);
	int fd4 = open("log4.txt", O_RDONLY | O_CREAT, 0666);
	int fd5 = open("log5.txt", O_RDONLY | O_CREAT, 0666);
	printf("fd1:%d\n", fd1);
	printf("fd2:%d\n", fd2);
	printf("fd3:%d\n", fd3);
	printf("fd4:%d\n", fd4);
	printf("fd5:%d\n", fd5);
	return 0;
}

【Linux】文件周邊001之系統(tǒng)文件IO,Linux,開發(fā)語言,linux

?為什么是從3開始呢?

我們剛才講進程默認會打開三個輸入輸出流:標準輸入流、標準輸出流、標準錯誤流。

所以0、1、2分別代表了它們。

從而我們得到文件描述符的分配規(guī)則:

找到當前沒有被使用的最小的下標,作為新的文件描述符。?


2.2close

close是關(guān)閉文件的系統(tǒng)調(diào)用接口。

int close(int fd);//參數(shù)fd是文件描述符
  • 關(guān)閉文件成功返回0;
  • 關(guān)閉文件失敗返回-1。

2.3write?

write是寫入文件的系統(tǒng)調(diào)用接口。

ssize_t write(int fd, const void *buf, size_t count);

功能:將buf位置開始向后count字節(jié)的數(shù)據(jù)寫入文件描述符為fd的文件當中。

  • 寫入成功,返回寫入數(shù)據(jù)的字節(jié)個數(shù)。
  • 寫入失敗,返回-1。

例如:?

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
	int fd = open("log.txt", O_WRONLY | O_CREAT, 0666);
	if (fd < 0){
		perror("open");
		return 1;
	}
	const char* msg = "hello syscall\n";
	for (int i = 0; i < 5; i++){
		write(fd, msg, strlen(msg));
	}
	close(fd);
	return 0;
}

2.4read

read是讀取文件的系統(tǒng)調(diào)用接口。

ssize_t read(int fd, void *buf, size_t count);

功能:從文件描述符為fd的文件讀取count字節(jié)的數(shù)據(jù)到buf位置當中。

  • 讀取成功,返回讀取數(shù)據(jù)的字節(jié)個數(shù)。
  • 讀取失敗,返回-1。

例如:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
	int fd = open("log.txt", O_RDONLY);
    if (fd < 0){
		perror("open");
		return 1;
	}
	char ch;
	while (1){
		ssize_t s = read(fd, &ch, 1);
		if (s <= 0){
			break;
		}
		write(1, &ch, 1); 
        //向文件描述符為1的文件寫入數(shù)據(jù),即向標準輸出流(顯示器)寫入數(shù)據(jù)
	}
	close(fd);
	return 0;
}

當然對于文件管理來說還有很多需要講解的細節(jié),博主會放到下一篇文章中詳細講解,下一篇文章會深入學習『 Linux系統(tǒng)是如何管理文件的』,『 文件描述符在其中又扮演了怎樣的角色』,『 怎么理解Linux下一切皆文件』等等內(nèi)容,本篇文章只是文件部分的簡單開頭,主要目的是為了『 作鋪墊』,更多內(nèi)容,請持續(xù)關(guān)注博主Linux系列文章。?

=========================================================================

如果你對該系列文章有興趣的話,歡迎持續(xù)關(guān)注博主動態(tài),博主會持續(xù)輸出優(yōu)質(zhì)內(nèi)容

??博主很需要大家的支持,你的支持是我創(chuàng)作的不竭動力??

??~ 點贊收藏+關(guān)注 ~??

=========================================================================

到了這里,關(guān)于【Linux】文件周邊001之系統(tǒng)文件IO的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux系統(tǒng)編程---文件IO

    Linux系統(tǒng)編程---文件IO

    一、系統(tǒng)調(diào)用 由操作系統(tǒng)實現(xiàn)并提供給外部應(yīng)用程序的編程接口(Application Programming Interface,API),用戶程序可以通過這個特殊接口來獲得操作系統(tǒng)內(nèi)核提供的服務(wù) 系統(tǒng)調(diào)用和庫函數(shù)的區(qū)別: 系統(tǒng)調(diào)用(系統(tǒng)函數(shù))? ???內(nèi)核提供的函數(shù) 庫調(diào)用 ???????????????????????

    2024年04月13日
    瀏覽(15)
  • 【Linux】基礎(chǔ)IO_文件系統(tǒng)

    【Linux】基礎(chǔ)IO_文件系統(tǒng)

    ?環(huán)境:centos7.6,騰訊云服務(wù)器 Linux文章都放在了專欄:【 Linux 】歡迎支持訂閱 相關(guān)文章推薦: 【Linux】馮.諾依曼體系結(jié)構(gòu)與操作系統(tǒng) 【C/進階】如何對文件進行讀寫(含二進制)操作? 【Linux】基礎(chǔ)IO_文件操作 【Linux】基礎(chǔ)IO_文件描述符與重定向 在前文我們所講的都是

    2024年02月05日
    瀏覽(43)
  • 【Linux】基礎(chǔ)IO----系統(tǒng)文件IO & 文件描述符fd & 重定向

    【Linux】基礎(chǔ)IO----系統(tǒng)文件IO & 文件描述符fd & 重定向

    作者:?舊言~ 座右銘:松樹千年終是朽,槿花一日自為榮。 目標:了解在Linux下的系統(tǒng)文件IO,知道什么是文件描述符,什么是重定向 毒雞湯:白日莫閑過,青春不再來。 專欄選自:Linux初階 望小伙伴們點贊??收藏?加關(guān)注喲???? 最早我們在C語言中學習關(guān)于如何用代碼

    2024年04月14日
    瀏覽(21)
  • 【Linux】基礎(chǔ)IO——系統(tǒng)文件IO&&fd&&重定向

    【Linux】基礎(chǔ)IO——系統(tǒng)文件IO&&fd&&重定向

    大家好我是沐曦希?? 空文件,也要在磁盤占據(jù)空間,因為文件也有屬性,屬性也屬于數(shù)據(jù),需要空間進行存儲。所以 文件包括內(nèi)容和屬性 所以 對文件操作就是對內(nèi)容或者對屬性進行操作,或者對內(nèi)容和屬性進行操作。 文件具有唯一性,所以在 標定一個文件時候,必須使用

    2024年02月02日
    瀏覽(19)
  • Linux之基礎(chǔ)IO文件系統(tǒng)講解

    Linux之基礎(chǔ)IO文件系統(tǒng)講解

    在C語言中,讀文件和寫文件是常見的操作,用于從磁盤讀取數(shù)據(jù)到內(nèi)存或?qū)?shù)據(jù)從內(nèi)存寫入磁盤文件中。這些操作需要使用標準庫中的文件I/O函數(shù)。下面我將詳細解釋如何在C語言中進行讀文件和寫文件操作,并舉例說明。 在C語言中,讀取文件的過程涉及以下步驟: 打開文

    2024年02月11日
    瀏覽(20)
  • 【Linux操作系統(tǒng)】舉例解釋Linux系統(tǒng)編程中文件io常用的函數(shù)

    【Linux操作系統(tǒng)】舉例解釋Linux系統(tǒng)編程中文件io常用的函數(shù)

    在Linux系統(tǒng)編程中,文件IO操作是非常常見和重要的操作之一。通過文件IO操作,我們可以打開、讀取、寫入和關(guān)閉文件,對文件進行定位、復制、刪除和重命名等操作。本篇博客將介紹一些常用的文件IO操作函數(shù)。 1.1 原型、參數(shù)及返回值說明 1.1.1 原型: open()函數(shù)是Linux系統(tǒng)

    2024年02月12日
    瀏覽(28)
  • 【Linux】基礎(chǔ)IO——文件系統(tǒng)|軟硬鏈接|動靜態(tài)庫

    【Linux】基礎(chǔ)IO——文件系統(tǒng)|軟硬鏈接|動靜態(tài)庫

    基于上篇博客所寫到的文件各種操作都是基于被打開文件所進行操作的,那么如果一個文件沒有被打開它存在哪里呢?這個答案毫無疑問肯定是存在于磁盤上的。那么,對于一個沒有打開的文件(也就是磁盤文件)我們應(yīng)該如何理解呢? 這里我們所要講的磁盤是機械硬盤、即

    2024年02月04日
    瀏覽(21)
  • 【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解

    【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解

    1、前言 我們一直都在說打開的文件,磁盤中包含了上百萬個文件,肯定不可能都是以打開的方式存在。其實文件包含打開的文件和普通的未打開的文件,下面重點談?wù)勎创蜷_的文件。 我們知道打開的文件是通過操作系統(tǒng)被進程打開,一旦打開,操作系統(tǒng)就要維護多個文件,

    2024年03月21日
    瀏覽(30)
  • Linux 系統(tǒng)調(diào)用IO口,利用光標偏移實現(xiàn)文件復制

    Linux 系統(tǒng)調(diào)用IO口,利用光標偏移實現(xiàn)文件復制

    用系統(tǒng)調(diào)用IO函數(shù)實現(xiàn)從一個文件讀取最后2KB數(shù)據(jù)并復制到另一個文件中,源文件以只讀方式打開,目標文件以只寫的方式打開,若目標文件不存在,可以創(chuàng)建并設(shè)置初始值為0664,寫出相應(yīng)代碼,要對出錯情況有一定的處理,并能夠讓用戶自行輸入要復制的文件名。 IO口即指

    2024年02月08日
    瀏覽(19)
  • 基于linux下的高并發(fā)服務(wù)器開發(fā)(第一章)- Linux系統(tǒng)IO函數(shù)

    基于linux下的高并發(fā)服務(wù)器開發(fā)(第一章)- Linux系統(tǒng)IO函數(shù)

    ?(1)man 2 open 打開一個已經(jīng)存在的文件 int open(const char *pathname, int flags); 參數(shù): ? ? ? ? ? ? pathname:要打開文件路徑 ? ? ? ? ? ? - flags:對文件的操作權(quán)限設(shè)置還有其他的設(shè)置 ? ? ? ? ? ? O_RDONLY,O_WRONLY,O_RDWR 這三個設(shè)置是互斥的 返回值: ? ? ? ? ? ? 返回一個新的文件描述

    2024年02月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包