本次實驗目的是學習程序fork函式的使用以及注意事項。
實驗環境為ubuntu16.04 編譯器是gcc 5.4
廢話不多說,先上**了。一會解釋。
#include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
int main()
if(pid > 0)
else if(pid == 0)
return 0;
}
解釋一下主函式下第一行**,
printf("before fork pid = %d\n",getpid());
這行**是列印當前程式得程序號,getpid()是獲取當前程式得程序號,並且列印出來。想要檢視getpid函式可以man 2 getpid 一下。
pid = fork();
這句**是複製程序的函式,
當複製程序成功,子程序返回0,父程序返回子程序的id,失敗返回-1.
這又有下面的**
if(pid == -1)
if(pid > 0)
else if(pid == 0)
如果pid == -1 列印錯誤資訊。如果pid > 0 列印父程序id和pid(也就是子程序id)如果 pid == 0 列印子程序id和父程序id
其中getppid函式是獲取父程序id的函式
這個是列印結果,很奇怪。
第乙個奇怪點,列印了三行。
按以前的思維pid只有一種狀態要麼大於0要麼等於0,怎麼會執行兩者都執行了。這個說起了就是fork函式的關係, fork函式建立了乙個子程序。那麼 pid == 0 的**是要在子程序中執行的,pid > 0是要在父程序中執行的。可以理解為cpu同一時間幹了兩件事,事實上並不是這樣,事實上是cpu切換程序來實現的,比如幹一件事幹了1ms切換到第二件事幹了1ms又切換到第一件事,這樣來回切換,給人的感覺就是cpu在同時幹兩件事。這就是為什麼可以輸出三行。
fork函式一次呼叫兩次返回。兩個是在各自的位址空間返回的。
還有乙個奇怪的地方那就是為什麼子程序中的父程序是1 不應是7807嗎?這個是因為父程序先執行完,執行完的程序及退出了,吧子程序託孤給1號程序。所以就出現這個現象,假如子程序先執行完,父程序在執行完就不會這樣了。下面我們可以讓父程序睡眠1s試試,這樣父程序就不會比子程序先執行完。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define err_exit(m) \
do \
while(0)
int main()
if(pid > 0)
else if(pid == 0)
return 0;
}看結果:
本次**只在上次**基礎上增加了一行**:
那就是sleep(1);
這行**的意思是睡眠1s的意思,延遲父程序的時間。
殭屍程序:子程序先退出,父程序尚未查詢子程序退出狀態,子程序就是殭屍狀態。
修改sleep(100)子程序為8029 父程序為8028
檢視子程序用 ps -ef 檢視
其中的意思就是殭屍程序。
如何避免殭屍程序:
只需要新增乙個訊號即可,
#include
在main函式下新增
signal(sigchld,sig_ign);
即可避免殭屍程序;
上**:
#include #include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
int main()
if(pid > 0)
else if(pid == 0)
return 0;
}
這就是結果殭屍程序已經不見了。 建立程序 fork函式
最近,我在linux中學到了乙個神奇的函式,名為fork 函式,它的作用是建立程序。它的神奇之處在於呼叫fork 函式時,系統會建立乙個與原來程序幾乎完全相同的程序,大致的意思就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事 就相當於是轉殖了乙個自己。先來看...
程序建立函式fork
函式原型 pid t fork void 標頭檔案 include 函式功能 建立乙個子程序 返回值 1.1 建立失敗 2.0 返回的是子程序 3.0 返回的是父程序,返回值是子程序 id函式特性 1.呼叫一次,會有兩個返回值 2.先返回哪個值,不確定,一般先返回父程序 3.使用者可以通過延時函式,...
建立程序函式fork的使用
1.pid t fork void 作用 建立乙個新的程序 返回值 如果呼叫成功,返回兩次。返回值為0,代表當前程序是子程序 返回值為非負數,代表當前程序為父程序。呼叫失敗,返回 1 c程式一開始,就會產生乙個程序,當這個程序執行到fork 的時候,會建立乙個子程序 此時父程序和子程序是共存的,它們...