fork程式設計實戰

2021-10-09 15:46:10 字數 2784 閱讀 3597

#include

pid_t fork

(void

);

由fork建立的新程序被稱為子程序。fork函式被呼叫一次,但返回兩次。兩次返回的唯一區別是子程序的返回值是0,而父程序的返回值是子程序的程序id。將子程序id發回給父程序的理由是:因為乙個程序的子程序可以有多哥,並且沒有乙個函式使乙個程序可以獲得其所有子程序的程序id。fork使子程序得到返回值0的理由是:乙個程序只會有乙個父程序,所以子程序總是可以呼叫getppid以獲得其父程序的程序id(程序id 0總是由核心交換程序使用,所以乙個程序id不可能為0)。

子程序和父程序繼續執行fork呼叫之後的指令。子程序是父程序的副本。例如,子程序獲得父程序資料空間、堆和棧的副本。注意,這是子程序所擁有的副本。父、子程序並不共享這些儲存空間部分。父、子程序共享正文段(**段)。

問題一:什麼是程式,什麼是程序,有什麼區別?

程式是靜態的概念,gcc ***.c -o pro 磁碟中生成pro檔案,叫做程式。

程序是程式的一次執行活動,程式跑起來,系統中就多了乙個程序。

問題二: 如何檢視系統中有哪些程序?

a.使用ps指令檢視,配合grep來查詢程式中是否存在某乙個程序。(ps -aux|grep ***)

b.運用top指令,類似windows下的任務管理器

問題三:什麼是程序識別符號?

每個程序都有乙個非負整數標識的唯一id,叫做pid,類似身份證

pid=0:稱為交換程序,作用—程序排程

pid=1:init程序,作用----系統初始化

程式設計呼叫getpid函式獲取自身的程序識別符號,getppid獲取父程序的程序識別符號。

問題四:什麼叫父程序,什麼叫子程序?

程序a建立了程序b,那麼a叫做父程序,b叫做子程序,父程序是相對的概念,理解為人類中的父子關係。

問題五:c程式的儲存空間是如何分配?(重點)

實列

#include

#include

#include

intmain()

else

return0;

}

資料段cp,共享**段

#include

#include

#include

intmain()

else

if(pid==0)

printf

("data=%d\n"

,data)

;return0;

}

1.乙個父程序希望複製自己,使父、子程序同時執行不同的**段。這在網路服務程序中是常見的-------父程序等待客戶端的服務請求。當這種請求到達時,父程序呼叫fork/,使子程序處理此請求。父程序則繼續等待下乙個服務請求到達。

2.乙個程序要執行不同的程式。這對shell是常見的情況。在這種情況下,子程序返回後立即呼叫exec。

#include

#include

#include

intmain()

else

if(pid==0)

}}else

}return0;

}

vfork函式也可以建立程序,與fork的區別關鍵區別一:vfork直接使用父程序儲存空間,不拷貝。

關鍵區別二:vforl保證子程序先執行,當子程序呼叫exit退出後,父程序才執行。

#include

#include

#include

#include

intmain()

}else

if(pid==0)

}}return0;

}

程序退出正常退出:1.main函式呼叫return 2.程序呼叫exit(),標準c庫 3.程序呼叫_exit()或者_exit(),屬於系統呼叫

補充:1.程序最後乙個執行緒返回 2.最後乙個執行緒呼叫pthread_exit

#include

#include

#include

#include

intmain()

}else

if(pid==0)

}}return0;

}

waitpid的用法wait使呼叫者阻塞,waitpid第三個引數,可以使呼叫者不阻塞。注意:此時的子程序是殭屍程序。

#include

#include

#include

#include

intmain()

}else

if(pid==0)

}}return0;

}

孤兒程序父程序如果不等帶子程序退出,在 子程序之前就結束了自己的「生命」,此時子程序叫做孤兒程序。linux避免系統存在過多孤兒程序,init程序收留孤兒程序,變成孤兒程序的父程序。

#include

#include

#include

#include

intmain()

else

if(pid==0)

}}return0;

}

Linux程式設計之fork

fork 建立乙個子程序 建立失敗返回負值 同時會有不同的錯誤碼 errno eagain 系統程序個數限制 enomem 申請記憶體失敗 enosys 系統平台不支援 建立成功將會返回兩個值 0 子程序的返回值,說明當前程式在子程序執行 0 父程序的返回值,說明當前程式在父程序執行,返回值為生成子...

fork程式設計注意事項

概念 對於unix環境中的高階程式設計而言,完整地了解unix的程序控制是非常重要的。其中必須熟練掌握的只有幾個函式 fork exec族 exit wait和waitpid。總結一下fork程式設計需要注意的細節 1.每個程序都有乙個非負整形表示唯一程序id,程序id可以重用,其中涉及延遲重用演算...

防止殭屍程序的fork程式設計

基本概念 孤兒程序與殭屍程序 原理就是捕獲sigchld訊號,通過waitpid函式處理子程序退出,直接上 gcc fork one.c include include include include include include void sig chld int signo int main ...