1.以父程序為模組複製建立出乙個程序,父子程序**共享。資料獨有
2.fork的返回值,父程序返回子程序的pid,子程序返回0
3.fork取決於cpu的排程
而vfork()也是建立乙個程序
實現:
#include#include#includeint main()
else if(pid>0)
}return 0;
}
vfork的特性:1.子程序沒有退出或者執行其他程式父程序是阻塞的,也就意味著子程序現執行,子程序退出之後父程序才能執行
2.建立出子程序大多都是為了執行其他程式,所以子程序會先執行
3.由於父子程序公用同一塊虛擬位址空間,所以子程序不退出,父程序就會阻塞。
vfork建立子程序的目的就是為了建立乙個子程序然後實現其他的程式,重新執行其他程式就是給子程序開闢新的空間,更新它的乙份位址空間,但是自從fork函式使用了寫時拷貝技術,vfork便被淘汰。
程序終止的方式有三種:
1.main函式中的return
2.exit庫函式呼叫
3._exit庫函式呼叫
我們先使用exit庫函式來終止乙個程序
我們使用_exit終止乙個程序
exit和_exit的區別exit是溫和型的退出,在退出前會溫和的釋放資源,重新整理緩衝區
_exit是暴力型的退出,直接釋放資源,不重新整理緩衝區
但是不管是哪一種主動退出的方式都會返回乙個數字,這個數字就是程序的退出狀態,它表明了程序退出的原因
1:正常退出完畢,結果符合預期
2:正常執行完畢,結果不符合預期
3:異常退出,返回狀態將不作為並判標準
乙個程序退出之後,因為要儲存自己的退出原因,因此並不會釋放所有的資源,它等著父程序檢視它的退出原因,然後釋放資源,假如父程序根本沒有管,那麼這個子程序就會變成殭屍程序,造成資源洩漏。
因此為了防止出現殭屍程序,父程序就應該管一下子程序的退出
1.pid_t wait(int status)
引數:status用於獲取子程序退出狀態碼
返回值是返回退出的子程序的pid
wait函式目的就是為了等待任意乙個子程序的退出,應為wait是乙個阻塞型的函式,因此如果沒有子程序退出那麼它就一直等待,直到有子程序退出
int main()
else if(pid==0)
pid_t id=-1;
if(id=wait(null)<0)
printf("child:%d exit:%d\n",od,pid);
return 0;
}
2.pid_t waitpid(pid_t pid, int *status, int options);
三個引數:
1.pid -1 等待任意子程序,>0等待指定的子程序
2.status :獲取退出狀態碼
3.options: 0 阻塞 ; wnohang feizuse
返回值 -
int main()
else if(pid==0)
pid_t id=-1;
while((id=waitpid(pid,null,wnohang))==0)
printf("child:%d exit:%d\n",id,pid);
return 0;
}
1,出錯;==0,沒有子程序退出 ; >0,退出的子程序pid
阻塞:為了完成乙個功能而發起的乙個函式呼叫,如果沒有完成這個功能則一直掛起等待功能完成才返回。
非阻塞:為了完成乙個功能而發起的乙個函式呼叫,如果現在不具備完成的條件則立刻返回不等待
waitpid可以等待指定的子程序,也可以等待任意的子程序。取決於waitpid的第乙個引數,
wait是乙個阻塞等待式的函式,必須等待到有乙個子程序退出後,獲取退出狀態,釋放支援才返回
waitpid可以設定為非阻塞。
#include#include#include#includeint main()
; //^\n:scanf本身是遇到空格就要獲取一次,這樣的話就無法獲取
// 遇到乙個完整的命令,因此%[^\n]表示的是獲取資料知道遇到\n
//%*c:將緩衝區的字元都取出來,但是不要它,直接丟掉
// 目的是為了將最後的\n從緩衝區取出來,防止陷入死迴圈
//if(scanf("%[^\n]%*c",buf)!=1)
//將獲取到的命令解析一下,然後建立子程序進行程式替換
char* ptr=buf;
char* argv[32]=;
int argc=0;
argv[argc++]=ptr;
iargv[argc++]=ptr;
}ptr++;
}if(fork()==0)
//需要等待的原因:
//1.避免產生殭屍程序
//2.是為了等待子程序執行完畢,讓程式邏輯更加完善
wait(null);
}return 0;
}
對shell的除錯結果:
linux 程序控制
什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...
Linux程序控制
linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...
linux程序控制
linux程序控制 編寫命令直譯器 一 背景 之前在 計算機作業系統 這本書中已經多次接觸了程序這一概念,而程序在作業系統中具體是做什麼的呢?卻沒有實際的與程序發生過互動,因此也就沒有實際的感受。對於我來說程序僅僅停留在概念的層面上 程序是程式執行時的記憶體空間和設定或者說程序就是程式的進行時。沒有...