程序建立fork()
fork()函式可以用來建立乙個子程序,它被呼叫一次,卻返回兩次,它可能有三種不同的返回值:在父程序中,fork返回新建立的子程序的pid;在子程序中,fork返回0;如果出現錯誤,fork返回乙個負值。
通過以下**可以驗證:
pid_t pid = fork();
if (pid == -1)
if (pid > 0) // 父程序
else
if (pid == 0) // 子程序
while (1);
用一條指令ps -ef | grep a.out 可以捕捉到兩個程序,id分別為 7005 和7006,這兩個分別是父程序和新建的子程序。所以可見在fork()返回0時確實建立了子程序。
當fork()順利完成任務時,就會存在兩個程序,每個程序都從fork()返回處開始繼續執行。兩個程序執行相同的**(text)段,但是有各自的堆疊(stack)段、資料(data)段以及堆(heap)。子程序的stack、data、heap segments是從父程序拷貝過來的。父子程序是共享**段的,所以從fork()之後父子程序是一起進行的,哪乙個程序先執行(scheduled to use the cpu)不確定。
通過下面的**可以看出:
pid_t pid = fork();
count++;
printf ("count = %d\n", count);
可以發現count被列印了兩次,且值都為一,所以父子程序是一起進行的,各有自己的資料段和堆,棧。
vfork()
vfork() 的用法和fork()比較類似,但也有幾點需要區別開來:vfork 的子程序必須要顯示呼叫 exit(); vfork 子程序和父程序共享資料段;vfork 的子程序先於父程序執行,子程序執行完,cpu才能排程到父程序
int count = 0;
pid_t pid = vfork();
if (pid < 0)
count++;
if (pid > 0) // 父程序
else
if (pid == 0) // 子程序
子程序在使用exit()才能顯示呼叫,在上面的**中,count在執行後或許還是兩個1,但我們如果把count改為全域性變數,結果就會有所不同了。
測試後發現,count加了兩次,所以可以發現,是子程序先執行,然後再執行父程序的,同時也可以發現他們是共用乙個資料段的。
exec函式族
exec函式族中函式是啟動乙個新程式,替換原有的程序,因此程序的pid不會改變。
execl()
#include
int execl(const char * path, const char* arg1,...)
path是可執行程式的路徑,後面則是相關的引數,引數可以有若干但必須以空指標null結尾。
通過以下操作可以操作乙個可執行程式file。
int ret = execl("/mnt/hgfs/share/0809/file", "./file", null);
execlp()
execlp()函式沒有多大說法只是path不含路徑,將從path環境變數中查詢該程式。我們可以將可執行檔案複製乙份到bin目錄下。
int ret = execlp("file1", "file1", null);
比如複製file1到bin目錄下,不許輸入絕對路徑即可實現同樣功能。
execv()
#include
int execv(const
char * path, const
char *argv)
execv就更沒什麼好說的了,只是將原先後面的引數放進了乙個字元陣列,其他並無何區別。
寫乙個案例:
char *a = ;
int ret = execv("/bin/ps", a);
再來講乙個功能強大的system()
system()
#include
int system(const
char* string)
呼叫fork產生子程序,由子程序來呼叫 /bin/sh -c string來執行引數string所代表的命令
system功能十分強大,幾乎就是直接向終端輸出指令,也不需要加更多的引數。
printf ("hellp world\n");
sleep(1);
// 在內部fork()乙個子程序,呼叫 /bin/sh -c string來執行
system("ps -ef | grep a.out");
可以說system 太方便了,似乎前面的都白學了,但對exec函式族的函式還是要有些了解的。 程序控制(2)
在程序控制 1 中,介紹了建立子程序fork和vfork函式,其實在建立乙個程序之後,子程序往往會呼叫乙個exec函式去執行另乙個程式。當呼叫乙個exec函式之後,該程序執行的程式完全替換為新程式,而新程式從main函式開始執行。exec函式並不建立新的程序,前後程序id不變,只是用磁碟上的乙個新程...
linux 程序控制2
在程序控制的章節我們講解了我們的程序建立,這章節對程序控制進行補充,在我們建立乙個程序之後我們避免不了我們去終止我們的程序。終止場景 終止方式 include void exit int status include void exit int status 雖然兩個函式都是可以讓程序終止的,但是兩...
程序控制相關的幾個函式
通常,建立新的程序,都是為了立即執行新的 不同的程式。所以一般都是fork 系統呼叫建立新程序,然後使用exec 系統呼叫函式組,來建立新的位址空間,把新的程式載入進去。最終,通過exit 系統呼叫退出程序,這個函式會終結程序,並釋放該程序占用的資源。父程序可以通過wait 系統呼叫,檢視子程序是否...