關於unix 系統調用fork()小結

  上週自習的時間我看了看一些,系統調用的博客。正好《深刻理解計算機》這本書也看到了這一部分,就寫一點簡單的我的體會。linux

  首先是fork函數,它是一個unix系統提供的系統接口,還有關於系統調用的補充,系統調用是經過異常(陷阱)來觸發進入內核模式的,因爲是在windows環境下不會調用win的系統調用,也就留着下次再linux上上代碼了,但這篇隨筆主要在於總結,而不是側重於講解函數。它的頭文件是#include<unistd.h> ,做用是建立一個子進程,而且會複製出父進程的用戶級的虛擬進程空間的副本,成功就會返回子進程的「pid_t」數據類型的變量 , 本質是一個int。失敗返回-1,還有一個很是重要的就是在子進程哪裏pid == 0 ,子進程建立後會和父進程併發執行若是不使用wait()函數就會讓子進程變成殭屍進程,使用ps -ax  z狀態的就是殭屍進程,這裏成爲殭屍進程的主要緣由是由於父進程先退出如代碼:(解決方法就是用wait函數,缺時間就不補了)windows

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 #include<errno.h>
 4 #include<sys/types.h>
 5 int main(void)
 6 {    
 7             pid_t  pid   =-1;
 8             if( (pid =  fork()) <  0){
 9                 printf("fork error  : %s", strerror());   //這這博客的插入代碼簡直受罪
10                 exit(0);
11              }         
12               else if(pid  ==  0  ){
            printf("child!\n");
            sleep(5);
13 exit(); 14 } 15 printf("the end!"); 16 exit(0); 17 }

  因爲是多進程操做系統,子進程父進程是並行的,父進程頗有可能會提早退出。天然這份代碼沒有使用wait函數來回收子進程也會形成不少麻煩,可是他們的輸出都會在同一個輸出流,這是由於子進程會繼承父進程的全部打開文件。先到這裏,看書了(水平不夠心中所想都不能正常表達)……有空再補併發

相關文章
相關標籤/搜索