Linux進程基礎知識

程序: 存儲在磁盤上的可執行指令和數據的靜態實體。

進程: 具有一定功能的程序關於一個數據集合的一次運行活動。
 
Linux中每創建一個進程,系統將從內存中創建一個task_struct 放入到 task 數組。
進程有兩種運行模式: 用戶模式 ,系統模式
進程不能被搶佔。Linux採用了預加載調度策略,每個進程只允許運行很短的時間(200ms), 這段時間稱之爲時間片。
 
通過fork函數來創建子進程,它是單調用雙返回函數,父進程中返回子進程標識號,子進程中返回0 代表 創建成功。在進程數超過系統限制或者進程請求的空間得不到滿足的時候會出現創建失敗的情況。如果父進程在創建子進程之前創建了共享內存,則子進程也擁有操作此共享內存的權利,因此要控制好同步操作。
 
vfork 創建的新進程主要目的在於用exec函數執行另外的程序。一般情況下,子進程用不到父進程的數據段,實際上在它還沒有運行exec或exit 之前是與父進程共享數據段的。子進行先用運行,父進程掛起,直到子進程調用exec或exit後,父進程的執行次序不再受限制。
 
vfork()用法與fork()相似.但是也有區別,具體區別歸結爲以下3點:
  1. fork():子進程拷貝父進程的數據段,代碼段. vfork():子進程與父進程共享數據段.
  2. fork():父子進程的執行次序不確定.
  vfork():保證子進程先運行,在調用exec或exit之前與父進程數據是共享的,在它調用exec
  或exit之後父進程纔可能被調度運行。
  3. vfork()保證子進程先運行,在她調用exec或exit之後父進程纔可能被調度運行。如果在
  調用這兩個函數之前子進程依賴於父進程的進一步動作,則會導致死鎖。
 
進程等待
 
       進程一旦調用了wait就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成殭屍的子進程,wait就會收集這個子進程的信息,並把它徹底銷燬後返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。
       參數status用來保存被收集進程退出時的一些狀態,它是一個指向int類型的指針。但如果我們對這個子進程是如何死掉毫不在意,只想把這個殭屍進程消滅掉,(事實上絕大多數情況下,我們都會這樣想),我們就可以設定這個參數爲NULL,就像下面這樣: pid = wait(NULL);  如果成功,wait會返回被收集的子進程的進程ID,如果調用進程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被置爲ECHILD。
      
一個簡單的c demo  實現子進程創建、進程等待等操作
 
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
 
int main()
{
int stat;
pid_t pid; 
        while((pid=fork())==-1);
if(pid==0)
{
execl("/bin/date","/bin/date",(char*)0);
return 0;
}
wait(&stat);
printf("stat:%d\n",stat);
return 0;
}

獨立博客地址: http://www.gddhx.com/post/42.html
發佈了47 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章