真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux重定向原理與系統(tǒng)調(diào)用dup2-創(chuàng)新互聯(lián)

🧸🧸🧸各位大佬大家好,我是豬皮兄弟🧸🧸🧸
在這里插入圖片描述

費縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!文章目錄
  • 一、重定向原理
    • ①輸出重定向
    • ②輸入重定向
  • 二、重定向的系統(tǒng)調(diào)用dup2
    • dup2輸出重定向
  • 三、如何理解一切皆文件
  • 四.緩沖區(qū)
    • ①常見的緩沖區(qū)刷新策略
    • ②緩沖區(qū)的認識

一、重定向原理

在這里插入圖片描述
因為文件類的接口都會去調(diào)用系統(tǒng)調(diào)用,因為對文件操作屬于是文件管理,這部分內(nèi)容是需要操作系統(tǒng)去完成的,因此在系統(tǒng)中,他是只認識fd這個數(shù)字的,并不知道FILE*這些,這些是上層封裝出來的

①輸出重定向

輸出重定向的本質(zhì)就是關掉stdout,也就是1號文件描述符,然后打開一個文件去占用這個文件描述符,然后輸出即可

int main()
{char buffer[SIZE]="zhupi";
	close(1);//unistd.h
	int fd = open("log.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
	//打開文件,寫|覆蓋|沒有則創(chuàng)建,權限為0666,真實權限需要集合權限掩碼 0666&umask
	if(fd<0) ...
	printf("fd:%d\n",fd);
	cout<

在這里插入圖片描述

②輸入重定向

輸入重定向就是關掉stdin,也就是0號文件描述符,然后打開文件,占用0號文件描述符的位置,然后鍵盤輸入,或者其他輸入進去即可

int main()
{char buffer[64];
	close(0);
	int fd = open("log.txt",O_RDONLY)
	if(fd<0) ...
	printf("fd:%d\n",fd);
	fgets(buffer,sizeof buffer,stdin);
	printf(buffer);
	printf("\n");
	close(fd);
	return 0;
}
二、重定向的系統(tǒng)調(diào)用dup2

在這里插入圖片描述
在這里插入圖片描述

int dup2(int oldfd,int newfd);

dup2的作用是把oldfd拷貝到newfd,比如給log.txt創(chuàng)建到3的位置,然后將3拷貝給1,所以3是oldfd,1是newfd(這只是dup2的做法,其實我們close掉1,再open文件log.txt也是一樣的效果)
在這里插入圖片描述

dup2輸出重定向
int main(int argc,char*argv[])
{printf("%d\n",argc);
	if(argc!=2)
	{return 2;
	}
	int fd = open("log.txt",O_WROLNY|O_CREAT|O_TRUNC,0666);
	if(fd<0)
	{perror("open");
		return 1;
	}
	dup2(fd,1);//old是fd,new是1,把fd拷貝給1
	fprintf(stdout,"%s\n",argv[1]);
	return 0;
}

當我們自己先close(1),再open log.txt,最后如果close(fd)的時候,發(fā)現(xiàn)并沒有輸出進log.txt,這是因為緩沖區(qū)的原因,還沒有刷新進log.txt就被關了,這個到后面緩沖區(qū)的時候再談,而dup2(fd,1)就不會,這是dup2的一種特性

三、如何理解一切皆文件

一切皆文件時Linux的設計哲學,體現(xiàn)在軟件設計層面
那Linux是C寫的,如何用C實現(xiàn)面向對象,甚至是運行時多態(tài)?

在這里插入圖片描述
也就是用結構體來體現(xiàn)類的成員變量,然后存函數(shù)指針來找成員函數(shù)
所以說底層不同的硬件,對應不同的操作方法就可以了,每個設備實現(xiàn)的read和write不同
所以設計了一個struct_file來描述,在上層沒有任何的硬件差別,看待所有文件的格式,都統(tǒng)一成了對file_struct的操作,所以在操作系統(tǒng)之上,Linux就有一切皆文件,Linux的這種管理模式,稱作VFS(virtual file system虛擬文件系統(tǒng))

在這里插入圖片描述

四.緩沖區(qū) ①常見的緩沖區(qū)刷新策略

1.立即刷新
2.行刷新(行緩沖)
3,滿刷新(全緩沖)

②緩沖區(qū)的認識

一般而言,行緩沖的設備一般是顯示器
因為顯示器是給用戶看的,一方面照顧效率,一方面照顧用戶體驗
全緩沖的設備一般是磁盤文件
因為刷新到磁盤文件,因為用戶是不需要馬上看到的,更在乎的是效率

但是所有的設備,都傾向于全緩沖,因為緩沖區(qū)滿了才刷新就意味著需要更少的IO操作->更少的訪問外設,提高效率,其他屬性層略是結合具體情況做的妥協(xié)(都傾向于緩沖區(qū))

例:
在這里插入圖片描述
因為向顯示器打印是行緩沖,所以都能夠正常打印,但當向文件中打印的時候,因為刷新策略是全緩沖(滿刷新),所以在程序結束之前或者說緩沖區(qū)滿之前并不會刷新到文件,所以子進程進行對父進程的拷貝,所以C的打印接口打印了兩次,那么write系統(tǒng)調(diào)用為什么只打印一次呢?因為緩沖區(qū)是C標準庫提供的,緩沖區(qū)并不是OS的,所以系統(tǒng)調(diào)用并不會用這套緩沖區(qū)的刷新策略,而且,父子進程所指向的緩沖區(qū)在打印之前也是指向的同一個,因為有寫時拷貝。(C的打印接口其實就是拷貝一份給緩沖區(qū),然后緩沖區(qū)去調(diào)用系統(tǒng)調(diào)來刷新)

上面我們指的緩沖區(qū)是用戶級緩沖區(qū),這個緩沖區(qū)是C標準庫提供的,除此之外,還有內(nèi)核級緩沖區(qū),其實調(diào)用write,也不是直接寫到外設上的,而是每個file結構體都有對應的內(nèi)核緩沖區(qū)。

需要注意的是:
1.我們需要避免在全緩沖策略下在還未刷新數(shù)據(jù)前關閉文件描述符導致數(shù)據(jù)并未刷新
2.通過關閉1號文件描述符,再讓打開的文件取占位,就可以達到行刷新的目的

在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


文章標題:Linux重定向原理與系統(tǒng)調(diào)用dup2-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://weahome.cn/article/cchcde.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部