子程序和父程序的pid一定不同嗎?

2021-05-25 00:35:37 字數 592 閱讀 9635

p

子程序和父程序的pid 一定不同嗎?

一般來說,子父程序的pid 是不同的。

除了系統的原始的0 號程序,建立乙個程序可以呼叫fork() 、vfork() 、clone() 函式。在/kernel/fork.c 的fork() 函式中有乙個標誌位clone_pid, 但這個標誌位為1 時,子父程序共用乙個程序號,也就是說,子程序雖然有自己的task_struct 資料結構,卻使用父親程序的pid 。但是,只有0 號程序,也就是系統中的原始程序,才允許這樣來呼叫__clone() 。

因為存在這樣的特例,在核心中我們判斷是否為同乙個程序,僅僅依據pid ,就有一點不安全。怎麼辦呢?

由於核心程序或執行緒,都有自己的核心堆疊,我們可以比較二者的堆疊的esp 指標,不同程序執行緒的esp 肯定是不同的,這種方法在2.6.24 的原始碼的arch/i386/kernel/process.c 的kernel_thread() 函式中有這樣的一句**:cmpl %%esp,%%esi 。但是這個方法不適合使用者態的程序,因為使用者態的程序不知到自己對應的核心堆疊指標,並且使用者態的程序或執行緒的pid

一定是不同的。前面的特例,僅僅是這核心態有這種pid

相同的情況。

父程序和子程序的關係(Linux C 程式設計)

父程序和子程序是並行執行的,先執行哪個是不確定的,在小紅帽系統中,先執行的是子程序,在ubuntu系統中,父程序是先執行的。其實誰先執行不重要了,一般在程式設計中,把父程序當做守護程序使用,用乙個waitpid pid,statloc,0 pid 等待子程序的結束,父程序一直阻塞在這個函式中,阻塞或...

Linux中父程序和子程序關係講解

先上 include include intmain else if ret 0 else return0 pid t getpid void 誰呼叫獲取誰的程序pid pid t getppid void 誰呼叫獲取誰的父程序pid 整體流程如下 輸入ps aux grep test檢視程序控制資...

子程序複製了父程序的什麼

這裡涉及到實體地址和邏輯位址 或稱虛擬位址 的概念 從邏輯位址到實體地址的對映稱為位址重定向 cpu產生的邏輯位址被分為 使用者只生成邏輯位址,且認為程序的位址空間為0到max。實體地址範圍從r 0到r max,r為基位址 每個程序都有自己的虛擬位址空間,不同程序的相同的虛擬位址顯然可以對應不同的實...