**:
我們都知道多程序同時操作檔案會出現問題,但是具體會出現什麼問題呢?不知道大家有沒有仔細研究過,今天我就帶大家一起來研究一下。
在操作檔案之前,很有必要了解一下核心中檔案的儲存和訪問方式:
這張圖摘自《apue》,我覺得畫的很好,所以就沒有自己再畫了。
從圖中能夠看出每個程序都有自己獨立的乙個程序表項,由檔案指標指向檔案表項;在檔案表項中兩個很重要的東西:狀態標誌和當前檔案偏移量,問什麼說它很重要,因為在多程序寫檔案出錯時,一般都是由檔案偏移量引起的(這個後面會講到);然後由v節點指標指向乙個v節點表(關於i節點我會在另外的部落格中闡述)
第一種情況:父子程序同時寫乙個檔案
父程序再用fork函式建立子程序的時候,會把自己的上下文環境拷貝乙份複製到子程序的記憶體空間中,這裡當然包括程序表。所以子程序的程序表和父程序的是一模一樣的,它們指向的是同乙個檔案表,上面講到過,當前偏移量會引起檔案操作錯誤。
到這裡的話,基本上就清楚了:如果寫操作是乙個原子操作的話(可以用pwrite實現),那麼父子程序寫同乙個檔案不會出現任何問題;如果不是原子操作的話,有可能在父程序的write函式沒有返回之前又執行了子程序的write函式,由於當前檔案偏移量沒有改變,所以會覆蓋掉原先內容。
第二種情況:非父子程序寫同乙個檔案
對於非父子型別的多程序寫同乙個檔案,其情況又是另外一回事了:
程序各自有各自的程序表,至於為什麼要有各自的程序表而不是共享乙個程序表?可以這麼想:各個程序開啟檔案的標誌可能會不一樣,有的可能唯讀、只寫、或者讀寫方式,這樣的話,它們中的內容肯定會不一樣。
對於fd0,假設它剛剛寫完乙個檔案,fd0指向的檔案表中的當前偏移量改變了,但是fd1中的偏移量沒有改變,這就造成fd1在寫檔案時會覆蓋fd0寫入檔案的內容。
具體情況大家可以在自己的機器上試驗一下。
linux同時建立多程序的方法
自己第一次寫建立多個程序的程式時不加思索地用迴圈,類似如下,for i 0 i 3 i 結果執行之後的結果很奇怪,因為父程序建立出來的子程序又會建立子程序,所以像一棵樹一樣建立下去,而不是所有子程序皆以主程序為父親!正確的方法應該是像引文中一樣,如下 法一1.include 2.include 3....
Linux操作檔案
語法 mkdir options dirname p 遞迴建立資料夾 mmode 新建資料夾,並設定資料夾的檔案訪問模式為mode 使用 p選項遞迴的建立wenjian test資料夾。linux下新建檔案的方式有非常多,比如 使用vi新建檔案 使用cp命令拷貝乙個檔案 可是最經常使用的還是使用to...
Linux操作檔案命令
1.編輯檔案 vi 檔名 再按i,進入編輯 按esc,按 輸入q 回車。放棄更改退出。按esc,按 輸入wq,回車。儲存更改退出。按esc鍵 跳到命令模式,然後 w 儲存檔案但不退出vi w file 將修改另外儲存到file中,不退出vi w 強制儲存,不推出vi wq 儲存檔案並退出vi wq ...