dup函式分析及應用場景

2021-10-06 10:17:52 字數 1232 閱讀 7550

unix系統中支援不同的程序共享的開啟檔案,dup函式可以複製乙個現有的檔案描述符,這裡的「複製」不是說dup返回完全一樣的檔案描述符,那是沒有意義的。而是返回乙個當前可用檔案描述符中的最小數值,通過這一新的檔案描述符也可以訪問該檔案。

從上圖我們可以了解到:

(1)每個程序在程序表中都有乙個記錄項,記錄項包含了一張開啟的檔案描述符表,該檔案描述符表中記錄了每個開啟檔案的檔案描述符和指向乙個檔案表的指標。

(2)核心為每個開啟檔案維持乙個檔案表,其中包含檔案狀態標誌、當前檔案偏移量和v節點指標。

(3)每個開啟的檔案都有乙個v節點,其中包含了i節點資訊,檔案型別等。

上圖中我們可以看到,兩個程序(a和b)都開啟同乙個檔案,那麼每個程序都會有自己的檔案表,每個程序也都擁有他們關於該檔案的自己的檔案狀態標誌,這裡要知道,幾乎在任何作業系統下,不同程序的位址空間都是完全不同的,所以即便兩個程序下的檔案描述符是一樣的,但是乙個程序下的檔案狀態變化,在另乙個程序下是不變的,這就會導致資料不同步或者資料被覆蓋,比如:

a程序此時呼叫read讀取3個位元組,那麼a程序所關聯的檔案表中的當前檔案偏移更新為三,但是因為b程序也擁有它自己的關於該檔案的檔案表,那麼對b程序來說當前檔案偏移量仍舊是在檔案頭處。與a程序無關,他們互不影響。這也是造成程序間資料覆蓋的原因。因為a程序寫了資料到檔案中只影響了自己的檔案表而不影響b程序的檔案表。那麼b程序寫資料到檔案時就會從頭開始寫造成資料被覆蓋。

為了解決上面提到的不同程序之間檔案共享的需求,unix提供了dup()功能,

dup原型如下:

int dup(int fd);
由dup返回的新檔案描述符是當前可用檔案描述符中最小數值。執行dup函式後的核心結構如下圖所示:

如果在b程序中直接呼叫dup進行賦值某乙個檔案描述符,dup函式會出錯的,原因還是不同程序之間是完全隔離的,直接複製同樣的描述符是沒有任何意義的,那麼如何讓兩個不同的程序之間進行檔案描述符傳遞呢,這就要用到ipc機制,也就是程序通訊機制了,並且呼叫ioctl函式,關於程序同步,就非常複雜和專業了,這裡就不做詳解了。

拷貝建構函式應用場景分析

拷貝建構函式又叫複製建構函式,是一種特殊的建構函式,它由編譯器呼叫來完成一些基於同一類的其他物件的構建及初始化。有四個應用場景。class aa aa const aa obj2 這裡即拷貝建構函式 aa protected private int a 第乙個應用場景 定義變數並初始化 建立乙個全域...

Flink應用場景分析

在資料劇增的今天,大資料技術也越來越被大家重視,而作為實時流計算的代表性框架之一,flink在近幾年的發展趨勢無疑也是驚人的,一方面是flink社群的活躍度,另一方面是flink在大資料計算上的優異表現,都讓我們知道,flink落地應用的潛力所在。今天我們就主要來了解下flink應用場景分析。以事件...

SSIS典型應用場景分析

ssis 提供一系列支援業務應用程式開發的內建任務 容器 轉換和資料介面卡,方便我們建立解決方案來解決複雜的業務問題,除了可以管理 sql server 資料庫以及在 sql server 例項之間複製 sql server 物件,我們還可以對oracle mysql excel等不同的異構資料來源...