Linux學習筆記—進程
來源:互聯網
上載者:User
1 進程的定義進程:進程是一個程式的一次執行過程,它和程式是有本質區別的,程式是靜態,它是一些儲存在磁碟上的指令的有序集合,沒有任何執行的概念;而進程是一個動態概念,它是程式執行的過程,包括了動態建立、調度和消亡的整個過程。它是程式執行和資源管理的最小單位。2 進程式控制制塊進程是Linux系統的基本調度單位,進程式控制制塊包含進程的描述資訊、控制資訊以及資源資訊,是進程的一個靜態描述。在Linux中,進程式控制制塊中的每一項都是一個task_struct結構,它是在include/linux/sched.h中定義的。3 在Linux中最主要的進程標識有進程號PID和它的父進程號PPID。PID與PPID都是非負數。#include<stdio.h>#include<unistd.h> #include<stdlib.h>int mian(){ printf("The PID of this process is %d\n",getpid()); printf("The PPID of this process is %d\n",getppid());}4 Linux中的進程包含3個段,分別為“資料區段”、“程式碼片段”和“堆棧段”。資料區段:存放的是全域變數、常量以及動態資料分配的資料空間程式碼片段:存放的是程式碼的資料堆棧段:存放的是子程式的返回地址、子程式的參數以及程式的局部變數5 Linux系統中,進程的執行模式劃分為使用者模式和核心模式。如果當前啟動並執行是使用者程式、應用程式或者核心之外的系統程式,那麼對應進程就是在使用者模式下進行的;如果在使用者程式執行過程中出現系統調用或者發生中斷事件,那麼就運行作業系統程式,進程模式就變成核心模式。使用者進程既可以在使用者模式下運行,也可以在核心模式下運行。6 調度進程:包括對進程的中斷操作、改變優先順序、查看進程狀態等,在Linux下可以使用相關的系統命令實現其操作Ps:查看系統中的進程Top:動態現實系統中的進程Nice:按使用者指定的優先順序運行Renice:改變正在運行進程的優先順序Kill:終止進程crontab:用於安裝、刪除或者列出用於驅動cron後台進程的任務Bg:將掛起的進程放到後台執行7 在Linux中建立一個進程的唯一方法是使用fork()函數。執行一次卻返回兩個值。fork函數用於從已存在的進程中建立一個新進程。新進程稱為子進程,而原來進程稱為父進程。這兩個分別帶回他們各自的傳回值,其中父進程的傳回值是子進程的進程號,而子進程則返回0.因此,可以通過傳回值來判定該進程是子進程還是父進程。8 perror()用來將上一個函數發生錯誤的原因輸出到標準錯誤(stderr)。參數s所指的字串會先列印出,後面再加上錯誤原因字串。此錯誤原因依照全域變數errno 的值來決定要輸出的字串。9 exec函數族提供了一個在進程中啟動另一個程式執行的方法,它可以根據指定的檔案名稱或目錄名找到可執行檔,並用它來取代原調用進程的資料區段、程式碼片段和堆棧段,在執行完之後,遠調用進程的內容除了進程號外,其他全部被新的進程替換了。另外,這裡的可執行檔可以是二進位檔案也可以是Linux下任何可執行檔指令檔。10 exec函數族成員函數:int execl(const char *path,const char *arg,.....)int execv(const char *path,char *const argv[])int execle(const char *path,const char *arg,.....,char *const envp[])int execve(const char *path,char *const argv[],char *const envp[])int execlp(const char *file,const char *arg,.....)int execvp(const char *file,char *const argv[])在使用exec函數族時,一定要加上錯誤判斷語句。因為exec很容易執行失敗,其中最常見的原因有:找不到檔案或路徑,此時errno被設定為ENOENT數組argv和envp忘記用NULL結束,此時errno被設定為EFAULT沒有對應可執行檔的許可權,此時errno被設定為EACCES11 exit和_exit函數都是用來終止進程的。當程式執行到exit或_exit時,進程會無條件的停止剩下的所有操作,清除包括PCB在內的各種資料結構,並終止本進程的運行。_exit() 直接使進程停止運行,清除其使用的記憶體空間,並清除其在核心中的各種資料結構。12 wait waitpidwait函數是用於使父進程阻塞,知道一個子進程結束或該進程接受導了一個指定的訊號為止。如果該父進程沒有子進程或者他的子進程已經結束,則wait就會立即返回。13 守護進程:是Linux中的後台服務進程,它是一個生存期較長的進程,通常獨立於控制終端並且周期性的執行某種任務或等待處理某些發生的事件。編寫守護進程:1)建立子進程,父進程退出2)在子進程中建立新會話進程組:進程組是一個或多個進程的集合。進程組由進程組ID唯一標識。每個進程組都有一個組長進程,其組長進程的進程號就等於進程組ID。交談群組:交談群組是一個或多個進程組的集合,通常,一個會話開始於使用者登陸,終止於使用者退出,在此期間該使用者啟動並執行所有進程都屬於這個會話期。setsid函數用來建立一個新的會話,並擔任該交談群組的組長。調用setsid有下面的3個作用:讓進程擺脫原會話的控制讓進程擺脫原進程組的控制讓進程擺脫原控制終端的控制3)改變目前的目錄為根目錄4)重設檔案許可權掩碼