linux 對父子程序共享檔案描述符的理解

2021-10-07 07:39:37 字數 1039 閱讀 7281

重新回顧一下什麼是檔案描述符:檔案描述符是由無符號整數表示的控制代碼,程序使用它來標識開啟的檔案。檔案描述符與包括相關資訊(如檔案的開啟模式、檔案的位置型別、檔案的初始型別等)的檔案物件相關聯,這些資訊被稱作檔案的上下文。

父子程序共享檔案描述符

相當於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...