一、程序與程式
程式是放到磁碟的可執行檔案
程序是指程式執行的例項
程序是動態的,程式是靜態的:程式是有序**的集合;程序是程式的執行。通常程序不可在計算機之間遷移;而程式通常對應著檔案、靜態和可以複製。
程序是暫時的,程式使長久的:程序是乙個狀態變化的過程,程式可長久儲存。
程序與程式組成不同:程序的組成包括程式、資料和程序控制塊(即程序狀態資訊)。
程序與程式的對應關係:通過多次執行,乙個程式可對應多個程序;通過呼叫關係,乙個程序可包括多個程式。
二、linux程序
linux系統是乙個多程序的系統,它的程序之間具有並行性、互不干擾等特點。
linux中的程序包含3個段,分別為「資料段」、「**段」和「堆疊段」。
「資料段」存放的是全域性變數、常數以及動態資料分配的資料空間;
「**段」存放的是程式**的資料。
「堆疊段」存放的是子程式的返回位址、子程式的引數以及程式的區域性變數等。
三、幾個概念
1、程序id(pid):標識程序的唯一數字
父程序的id(ppid)
啟動程序的使用者id(uid)
2、程序互斥是指當有若干程序都要使用某一共享資源時,任何時刻最多允許乙個程序使用,其他要使用該資源的程序必須等待,直到占用該資源者釋放了該資源為止。
3、臨界資源:作業系統中將一次只允許乙個程序訪問的資源稱為臨界資源。
4、臨界區:程序中訪問臨界資源的那段程式**稱為臨界區,為實現對臨界資源的互斥訪問,應保證諸程序互斥地進入各自的臨界區。
5、程序同步:一組併發程序按一定的順序執行的過程稱為程序間的同步,具有同步關係一組併發程序稱為合作程序,合作程序間互相傳送的訊號稱為訊息或事件。
6、死鎖:多個程序因競爭資源而形成一種僵局,若無外力作用,這些程序都將永遠不能再向前推進。
四、獲取id
pid_t getpid(void) 獲取本程序id
pid_t getppid(void) 獲取父程序id
#include
#include
#include
int main()
五、程序建立
pid_t fork(void)
功能:建立子程序 fork的奇妙之處在於它被呼叫一次,卻返回兩次,它可能有三種不同的返回值:
0: 子程序
子程序id(大於0):父程序
-1: 出錯
#include
#include
#include
#include
int main()
else
if(0 == pid)
else
return0;}
//子程序的資料空間、堆疊空間都會從父程序得到乙個拷貝,而不是共享。
pid_t vfork(void)
功能:建立子程序
vfork()會產生乙個新的子程序,其子程序會複製父程序的資料與堆疊空間,並繼承父程序的使用者**,組**,環境變數、已開啟的檔案**、工作目錄和資源限制等。
子程序不會繼承父程序的檔案鎖定和未處理的訊號。
vfork子程式先執行
#include
#include
#include
#include
int main()
else
if(0 == pid)
else
return
0;}
fork和vfork的區別:
1、fork:子程序拷貝父程序的資料段
vfork:子程序與父程序共享資料段
2、fork:父、子程序的執行次序不確定
vfork:子程序先執行,父程序後執行
六、exec函式族
exec用被執行的程式替換呼叫它的程式。
區別:fork建立乙個新的程序,產生乙個新的pid。
exec啟動乙個新程式,替換原有的程序,因此程序的pid不會改變
例:execl
int execl(const char * path,const char * arg1, …)
引數:
path:被執行程式名(含完整路徑)。
arg1 – argn: 被執行程式所需的命令列引數,含程式名。以空指標(null)結束。
#include
#include
#include
#include
int main()
else
if(0 == pid)
else
return
0;}
execv
int execv (const char * path, char * const argv[ ])
引數:
path:被執行程式名(含完整路徑)。
argv: 被執行程式所需的命令列引數陣列。
#include
#include
int main()
; execv("home/12.06/test",argv);
return
0;}
七、程序等待
pid_t wait (int * status)
功能:阻塞該程序,直到其某個子程序退出。
pid_t waitpid (pid_t pid, int * status, int options)
功能:會暫時停止目前程序的執行,直到有訊號來到或子程序結束
引數:如果不在意結束狀態值,則引數status可以設成null。
引數pid為欲等待的子程序識別碼:
pidpid=-1 等待任何子程序,相當於wait()。
pid=0 等待程序組識別碼與目前程序相同的任何子程序。
pid>0 等待任何子程序識別碼為pid的子程序。
引數option可以為0 或下面的or 組合
wnohang: 如果沒有任何已經結束的子程序則馬上返回,不予以等待。
wuntraced :如果子程序進入暫停執**況則馬上返回,但結束狀態不予以理會。
#include
#include
#include
#include
#include
#include
int main()
else
if(0 == pid)
else
if(wifexited(status))
return
0;}
八、殭屍程序
殭屍程序指的是那些雖然已經終止的程序,但仍然保留一些資訊,等待其父程序為其收屍。
如果乙個程序在其終止的時候,自己就**所有分配給它的資源,系統就不會產生所謂的殭屍程序了。
九、程序退出
exit,_exit用於終止程序
區別:
_exit: 直接使程序停止,清除其使用的記憶體,並清除緩衝區中內容
exit與 _exit的區別:在停止程序之前,要檢查檔案的開啟情況,並把檔案緩衝區中的內容寫回檔案才停止程序。
void exit(int status);
exit()用來正常終結目前程序的執行,並把引數status返回給父程序,而程序所有的緩衝區資料會自動寫回並關閉未關閉的檔案。
void _exit(int status);
_exit()用來立刻結束目前程序的執行,並把引數status返回給父程序,並關閉未關閉的檔案。
此函式呼叫後不會返回,並且會傳遞sigchld訊號給父程序,父程序可以由wait函式取得子程序結束狀態。
Linux 程序控制程式設計
1 fork 在linux 中建立乙個新程序的惟一方法是使用fork 函式。fork 函式是linux 中乙個非常重要的函式,和 讀者以往遇到的函式有一些區別,因為它看起來執行一次卻返回兩個值。難道乙個函式真的能返回兩個值 嗎?希望讀者能認真地學習這一部分的內容。1 fork 函式說明。fork 函...
Linux程序控制程式設計(五)
一 程序建立 在pid fork 之前,只有乙個程序在執行,但在這條語句執行之後,就變成兩個程序在執行了,這兩個程序的共享 段,將要執行的下一條語句都是if pid 0 兩個程序中,原來就存在的那個程序被稱作 父程序 新出現的那個程序被稱作 子程序 父子程序的區別在於程序識別符號 pid 不同.例 ...
linux程式設計之程序控制
一 fork include pid t fork void 返回值 有兩個,乙個是子程序的id,另乙個為零。當返回值為0時,進入子程序,大於0進入父程序,返回 1時建立程序錯誤。子程序與父程序的比較 1 子程序與父程序的程序id不同。且父程序id不同。2 記憶體布局 子程序是父程序的副本,其中子程...