linux中有一句話叫,一切皆檔案。每個linux檔案都有乙個型別來表明它在系統中的角色:
1.普通檔案:包含任意資料。應用程式常常要區分文字檔案和二進位制檔案,文字檔案即只含有ascii或unicode字元的普通檔案,二進位制檔案是所有其他檔案
2.目錄檔案:包含一組鏈結的檔案。其中每個鏈結都將乙個檔名系引(filename)對映到乙個檔案,這個檔案可能是另乙個目錄。用來操作目錄的命令主要有 mkdir, ls, rmdir。目錄是以樹狀結構組織的,根目錄是 /(slash)。核心會為每個程序儲存當前工作目錄(cwd, current working directory),可以用 cd 命令來進行更改。我們通過路徑名來確定檔案的位置,一般分為絕對路徑和相對路徑。
3.套接字:用來與另乙個程序進行跨網路通訊的檔案。
4.鏈結檔案。
5.命名管道。
6.字元檔案。
7.塊裝置。
開啟檔案:乙個應用程式通過要求核心開啟相應的檔案,來表明它想要訪問乙個i/o裝置。這時核心會返回乙個小的非負整數,叫做檔案描述符(它是關鍵!它返回的是當前所能用的最小數):用來標識這個檔案。
linux shell 建立的每個程序開始時都有三個開啟的檔案:標準輸入(檔案描述符為0),標準輸出(1),標準錯誤(2)
#include
#include
#include
intopen
(char
*fileename,
int flags, mode_t mode)
;
讀寫檔案:乙個讀操作就是從檔案複製n>0個位元組到記憶體,從k位置開始,當超過時會觸發乙個稱為eof的條件。
#include
ssize_t read
(int fd,
void
*buf, size_t n)
;ssize_t write
(int fd,
const
void
*buf, size_t n)
;
關閉檔案:當應用完成對檔案的訪問之後,就通知核心關閉這個檔案。作為相應,核心釋放檔案開啟時建立的資料結構,並將這個描述符恢復到可用的描述符池中。
#include
intclose
(int fd)
;
共享檔案兩個描述符引用兩個不同的開啟檔案。 描述符1(stdout)指向終端,描述符4指向開啟磁碟檔案
兩個不同的描述符通過兩個不同的開啟檔案表條目共享同一磁碟檔案
例如,使用相同的檔名引數呼叫兩次open
子程序繼承其父程序的開啟檔案
注意:exec函式保持不變的情況(使用fcntl進行更改)
在fork呼叫之前:
子程序繼承其父程序的開啟檔案
後叉:孩子的表與父母的表相同,並為每個引用+1
在此之外就是乙個小知識點,是c語言標準庫里的標準i/o函式,其實它們也就是對之前說的系統函式進行了封裝,得以獲得更好的可移植性:
開啟和關閉檔案: fopen, fclose
讀取和寫入位元組: fread, fwrite
讀取和寫入行: fgets, fputs
格式化讀取和寫入: fscanf, fprintf
假設檔案內容為abcde
#include
intmain
(int argc,
char
*ar**)
本來fd1,fd2,fd3開啟同乙個檔案,
但是dup2(fd2,fd3),使fd3指向fd2開啟的檔案,
所以fd1,fd2輸出的是a,fd3輸出的是3,
則輸出結果為c1=a,c2=a,c3=b
第二題:
#include
intmain
(int argc,
char
*ar**)
else
return0;
}
此處用到了fork的內容
當s=0時,父程序先執行,輸出
parent: c1 = a, c2 =b
child: c1 = a, c2 = c
s=1,則子程序先執行,輸出
child: c1 = a, c2 = b
parent: c1 = a, c2 =c
第三題:
#include
intmain
(int argc,
char
*ar**)
深入計算機系統基礎 系統級I O技術日誌
概念 所有的i o裝置都被模型化為檔案,而所有的輸人作對相應檔案的讀和寫來執行。這種將裝置優雅地對映為檔案的方式,允許linux核心出乙個簡單 低階的應用介面,稱為unix 1 o。於 深入計算機系統基礎 第三版 分別呼叫read和write函式來執行輸入和輸出 觀察以下 what would th...
計算機系統基礎
includeint main return 0 如果將表示式換成 2147483647 1 2147483647 結果又會怎麼樣呢 編譯器如何處理字面量 高階語言中運算規則 高階語言與指令之間的對應 機器指令的執行過程 機器級資料的表示和運算 sum int a unsigned int len ...
計算機系統基礎 學習開篇
title 計算機系統基礎 學習開篇 author qian jipeng tags 作為乙個非科班出身的半吊子程式設計師 程式設計師?在和計算機專業的同學交流的過程中,切實感受到知識面的匱乏,總體體現在對計算機系統的理解。確實,作為一名雙非院校信管專業的學生,本身起步就比別人慢了不少,若沒有紮實的...