關於程序建立fork函式的理解

2021-09-26 07:31:09 字數 2210 閱讀 6876

fork一次返回2個值,返回三類值。函式原型:pid_t fork();

正:fork父程序,返回子程序id;

零:fork子程序,返回0;

負:fork失敗。

fock函式呼叫一次卻返回兩次。向父程序返回子程序的id,向子程序中返回0,這是因為父程序可能存在很多過子程序,所以必須通過這個返回的子程序id來跟蹤子程序,而子程序只有乙個父程序,他的id可以通過getppid取得。

#include #include int main(int argc, char **ar**)

else if (!pid )

else

printf( "this is third time, pid = %d\n", pid );

printf( "this is fouth time, pid = %d\n", pid );

return 0;

}

結果為:

[root@localhost test]# ./testpro

this is first time, pid = 7703

this is second time, pid = 7703

count = 1

this is the parent process,the child has the pid:7703

this is third time, pid = 7703

this is fouth time, pid = 7703

this is first time, pid = 0

this is second time, pid = 0

count = 1

this is the child process.

this is third time, pid = 0

this is fouth time, pid = 0

為什麼子程序列印的pid為0呢,是因為在核心裡面沒有直接獲取子程序id的函式,因此在父程序中使用fork返回子程序id,子程序中返回0。      

count的值還是1。是因為被fork建立的新程序叫子程序。fork函式被呼叫一次,卻兩次返回。返回值唯一的區別是在子程序中返回0,而在父程序中返回子程序的pid。在父程序中要返回子程序的pid的原因是父程序可能有不止乙個子程序,而乙個程序又沒有任何函式可以得到他的子程序的pid。

子程序和父程序都執行在fork函式呼叫之後的**,子程序是父程序的乙個拷貝。例如,父程序的資料空間、堆疊空間都會給子程序乙個拷貝,而不是共享這些記憶體。

也就是說,在linux下乙個程序在記憶體裡有三部分的資料,就是"**段"、"堆疊段"和"資料段"。"**段",顧名思義,就是存放了程式**,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用相同的**段。

針對linux中的程序的5個段的說明,參考:

乙個程式一旦呼叫fork函式,系統就為乙個新的程序準備了前述三個段,首先,系統讓新的程序與舊的程序使用同乙個**段,因為它們的程式還是相同的,對於資料段和堆疊段,系統則複製乙份給新的程序,這樣,父程序的所有資料都可以留給子程序,但是,子程序一旦開始執行,雖然它繼承了父程序的一切資料,但實際上資料卻已經分開,相互之間不再有影響了,也就是說,它們之間不再共享任何資料了。

fork()不僅建立出與父程序**相同的子程序,而且父程序在fork執行點的所有上下文場景也被自動複製到子程序中,包括:

——全域性和區域性變數

——開啟的檔案控制代碼

——共享記憶體、訊息等同步物件

而如果兩個程序要共享什麼資料的話,就要使用另一套函式(shmget,shmat,shmdt等)來操作。現在,已經是兩個程序了,對於父程序,fork函式返回了子程式的程序號,而對於子程式,fork函式則返回零,這樣,對於程式,只要判斷fork函式的返回值,就知道自己是處於父程序還是子程序中。

檢視程序:

[root@localhost test]# ps -l

f s uid pid ppid c pri ni addr sz wchan tty time cmd

4 s 0 7603 7580 0 80 0 - 29141 wait pts/0 00:00:00 bash

0 r 0 7713 7603 0 80 0 - 37233 - pts/0 00:00:00 ps

並沒有7703的程序?why?

建立程序 fork函式

最近,我在linux中學到了乙個神奇的函式,名為fork 函式,它的作用是建立程序。它的神奇之處在於呼叫fork 函式時,系統會建立乙個與原來程序幾乎完全相同的程序,大致的意思就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事 就相當於是轉殖了乙個自己。先來看...

程序建立函式fork

函式原型 pid t fork void 標頭檔案 include 函式功能 建立乙個子程序 返回值 1.1 建立失敗 2.0 返回的是子程序 3.0 返回的是父程序,返回值是子程序 id函式特性 1.呼叫一次,會有兩個返回值 2.先返回哪個值,不確定,一般先返回父程序 3.使用者可以通過延時函式,...

建立程序庫函式fork

unix作業系統提供了庫函式fork來建立乙個新的程序,本文分析一下fork呼叫背後發生了什麼。例如 int pid fork 從fork函式返回,父程序 pid 0 和子程序 pid 0 擁有相同的user leverl context 包括data,text以及stack 的拷貝。fork函式的...