C C 程序的探索(fork函式)

2021-09-10 04:52:20 字數 2542 閱讀 5004

本次實驗目的是學習程序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 的時候,會建立乙個子程序 此時父程序和子程序是共存的,它們...