上週自習的時間我看了看一些,系統調用的博客。正好《深刻理解計算機》這本書也看到了這一部分,就寫一點簡單的我的體會。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函數來回收子進程也會形成不少麻煩,可是他們的輸出都會在同一個輸出流,這是由於子進程會繼承父進程的全部打開文件。先到這裏,看書了(水平不夠心中所想都不能正常表達)……有空再補併發