重新回顧一下什麼是檔案描述符:檔案描述符是由無符號整數表示的控制代碼,程序使用它來標識開啟的檔案。檔案描述符與包括相關資訊(如檔案的開啟模式、檔案的位置型別、檔案的初始型別等)的檔案物件相關聯,這些資訊被稱作檔案的上下文。
父子程序共享檔案描述符
相當於2個 fd指向同一塊記憶體空間.
因為2個程序共享了檔案指標偏移量,所以都能向檔案中有序寫資料
如果乙個程序開啟了乙個檔案以後,建立子程序,那麼子程序會繼承父程序的環境和上下文中的大部分內容,包括檔案描述符。此時父子程序享有相同的檔案偏移量。
(注意,如果父程序先建立子程序,然後父程序再開啟乙個檔案,那顯然,子程序不會有這個檔案描述符,這個例子見case2)
例子:
#include
#include
//包含o_rdonly等巨集定義
//我想驗證父子程序是不是享有相同的檔案偏移量
intmain
(void
) pid_t pid=
fork()
;if(pid==-1
)if(pid>0)
wait
(null);
}else
close
(fd)
;return0;
//執行完畢後觀察檔案裡的內容
}
原來test.txt的內容:abcdefg
執行完畢後觀察檔案裡的內容:
這就證實了:如果乙個程序開啟了乙個檔案以後,建立子程序,子程序會繼承父程序的檔案描述符。此時父子程序享有相同的檔案偏移量。
再看另一種情況:
這種情況下,由於父子程序的檔案描述符是不一樣的,所以雖然兩個檔案描述符都是對同乙個檔案進行操作,但是此時父子程序不享有相同的檔案偏移量,各自的檔案偏移量互不影響。
在Linux下父子程序對共享儲存區的訪問
子程序向共享儲存區寫資料,父程序讀共享儲存區資料。子程序向共享儲存區修改資料,父程序讀共享儲存區資料 本次實驗其實重點的是這麼幾個變數 addr shmid 以及幾個重要的函式 shmet shmat shmget shmctl 對於系統v共享記憶體,主要有以下幾個api shmget shmat ...
父子程序資料共享問題
1 fork cpp view plain copy include include pid t fork void 正確返回 父程序中返回子程序的程序號 子程序中返回0 錯誤返回 1 子程序是父程序的乙個拷貝。子程序從父程序那得到了資料段和堆疊段,但不是與父程序共享而是單獨分配記憶體。fork函式...
父子程序共享的資源
先來看乙個題目 當父程序呼叫fork 建立子程序之後,下列哪些變數在子程序中修改之後,父程序裡也會相應地作出改動?a.全域性變數 b.區域性變數 c.靜態變數 d.檔案指標 答案為d,解釋如下 fork 子程序和父程序共享的資源 開啟的檔案 實際使用者id 實際組 id 有效使用者 id 有效組 i...