国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

linux之C編程學習——進程,進程,進程!

2024-06-28 13:22:04
字體:
來源:轉載
供稿:網友
linux之C編程學習——進程,進程,進程!

  linux支持多個進程同時進行,也就是我們常說的現代操作系統中的多道程序設計,所謂同時是linux系統調度各個進程分別占用cpu的時間。由于每個時間片的時間很小和宏觀時間相比,給人的感覺是多個進程在運行。為了提高程序的運行效率,程序往往分成多個部分組成,這也就是說的并發程序設計。并發程序中各進程是相互獨立的,在必要的時候會通過相應的機制進行通信。若進程間要共享資源,為了避免出現沖突,常通過相應通信機制使它們輪流使用共享資源。在進程進行通信時,會出現一個進程等另一個進程完,才能繼續運行的情況,這也需要進程間通信以了解對方的運行情況。有時進程間會出現互斥現象,這是會用到鎖機制。在并發程序設計中,進程的創建和結束是由用戶決定的。這也就出現了父進程和子進程概念。

進程的創建:

1 #include <unistd.h>  2   3 pid_t fork(void);   4 pid_t vfork(void); 

  在這簡述,fork創建的子進程是父進程的一個拷貝,但是和父進程使用不同的數據段和堆棧。vfork和fork基本相同但是vfork不會復制父進程的數據段,它們共享數據段。這是因為vfork常和exec函數使用去調用一個程序如ls命令,開啟一個新的進程。vfork后父進程會等待子進程運行結束或調用了exit。fork后父進程和子進程的運行順序是不確定的。

下面是體現它們性質的程序:

 1 #include <sys/types.h>   2 #include <stdio.h>   3 #include <stdlib.h>   4 #include <unistd.h>   5     6 main()     7 {   8      pid_tpid;   9      char*pchar = "before fork";  10      inttest_va = 1;  11   12      if((pid= fork()) < 0 )  13      {  14          PRintf("forkerror!!/n");  15          exit(1);  16      }  17   18      elseif(pid == 0)  19      {  20          printf("childprocess/n");  21          pchar= "child pchr/n";  22          printf("%s/n",pchar);  23   24          test_va= 2;  25   26          printf("%d/n",test_va);  27          _exit(2);  28      }  29   30      else  31      {  32          printf("parentprocess/n");  33          printf("%s/n",pchar);  34          printf("%d/n",test_va);  35      }    36 } 

fork:

vfork:

進程等待:

 1 #include <sys/types.h>   2 #include <stdio.h>   3 #include <sys/wait.h>   4    5 void check_exit(int status);   6    7 main()   8 {   9     pid_t pid;  10     int status;  11     if((pid = fork()) < 0)  12     {  13     printf("fork error!!/n");  14     exit(0);  15     }  16     else if(pid == 0)  17     {  18     printf("child process exit/n");  19     exit(0);  20     }  21     else  22     {  23         if(wait(&status) != pid)  24         {  25         printf("wait error!!");  26         exit(0);  27         }  28         check_exit(status);  29     }  30   31 }  32 void check_exit(int status)  33 {  34     if(WIFEXITED(status))  35         printf("eixt/n");  36       37     else if(WIFSIGNALED(status))  38         printf("killed by signal/n");  39     else if(WIFSTOPPED(status))  40         printf("stopped by signal/n");  41     else if(WIFCONTINUED(status))  42         printf("continued");  43 }  

  等待進程改變其狀態。所有下面哪些調用都被用于等待子進程狀態的改 變,獲取狀態已改變的子進程信息。狀態改變可被認為是:1.子進程已終止。2.信號導致子進程停止執行。3.信號恢復子進程的執行。在子進程終止的情況 下,wait調用將允許系統釋放與子進程關聯的資源。如果不執行wait,終止了的子進程會停留在"zombie"狀態。如果發現子進程改變了狀態,這些調用會立即返回。反之,調用會被阻塞直到子進程狀態改變,或者由信號處理句柄所中斷(假如系統調用沒有通過sigaction的SA_RESTART標志重啟動)。wait 系統調用掛起當前執行中的進程,直到它的一個子進程終止。waitpid掛起當前進程的執行,直到指定的子進程狀態發生變化。默認,waitpid只等待 終止狀態的子進程,但這種行為可通過選項來改變。waitid系統調用對于等待哪個子進程狀態改變提供了更精確的控制。

  子進程已終止,父進程尚未對其執行wait操作,子進程會轉入“僵死”狀態。內核為“僵死”狀態的進程保留最少的信息量(進程標識,終止狀態,資源使用信息),過后 父進程執行wait時可以獲取子進程信息。只要僵死的進程不通過wait從系統中移去,它將會占據內核進程表中的一個欄位。如果進程表被填滿,內核將不能 再產生新進程。如果父進程已終止,它的僵死子進程將由init進程收養,并自動執行wait將它們移去。

#include<sys/types.h>   #include<sys/wait.h>    pid_t wait (int * status); 

  wait()會暫時停止目前進程的執行(掛起父進程),直到有信號來到或子進程結束。如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數 status 可以設成 NULL。如果調用wait的進程沒有子進程則會調用失敗,子進程的結束狀態值參考 waitpid( );如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存于errno 中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁陕县| 澄江县| 徐闻县| 米林县| 安庆市| 扎鲁特旗| 建宁县| 广宁县| 盐山县| 驻马店市| 昭通市| 金门县| 平邑县| 曲阜市| 南江县| 香河县| 浏阳市| 同江市| 泰和县| 阳西县| 习水县| 青川县| 罗定市| 高唐县| 和政县| 班戈县| 外汇| 东城区| 疏附县| 合阳县| 仲巴县| 绵竹市| 德江县| 青浦区| 交口县| 邹平县| 绍兴县| 木兰县| 锦州市| 阿鲁科尔沁旗| 黄冈市|