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函式的...