標籤:linux 作業系統 進程 fork
一、linux進程
linux是一個多使用者多任務的作業系統。
多使用者是指多個使用者可以在同一時間使用電腦;
多任務是指linux可以同時執行幾個任務。
進程簡單來說就是運行中的程式,Linux系統的一個重要特點是可以同時啟動多個進程。根據作業系統的定義:進程是作業系統資源管理的最小單位。
1.Linux進程的概念
進程是一個動態實體,是程式一次執行過程,並且進程是作業系統資源分派的基本單位。
進程與程式的區別:進程是動態,程式是靜態;進程是運行中的程式,而程式還是儲存在硬碟上的可執行代碼。
進程與線程的區別:為了讓電腦在同一時間內能執行更多任務,在進程內部又劃分了許多線程。線程是在進程內部,比進程更小並且能獨立啟動並執行基本單元。進程在執行過程擁有獨立的記憶體單元,但是線程基本上不擁有系統資源,它與同屬一個進程的其他線程共用進程擁有的全部資源。
2.Linux進程的標誌
Linux作業系統中,每個進程都是通過唯一的進程ID標識的。進程ID是一個非負數,每個進程除了進程ID外還有一些其他標識資訊,它們都可以通過相應的函數獲得。函式宣告在unistd.h標頭檔中。
getpid():獲得進程ID
getppid():獲得進程父進程的ID
getuid():獲得進程實際使用者ID
geteuid():獲得進程有效使用者ID
getgid():獲得進程實際組ID
getegid():獲得進程有效組ID
3.Linux進程的結構
Linux中的一個進程由3個部分組成:程式碼片段、資料區段、堆棧段。
程式碼片段:存放程式的可執行代碼。
資料區段:存放程式的全域變數、常量、靜態變數。
堆棧段中的堆區:存放動態分配的記憶體變數。
堆棧段中的棧區:用於函數調用,它存放著函數的參數、函數內部定義的局部變數。
4.Linux進程的狀態
運行狀態:進程正在運行或iozai運行隊列中等待運行。
可中斷等待狀態:進程正在等待某個事件完成。等待過程中可以被訊號或定時器喚醒。
不可中斷等待狀態:進程正在等待某個事件完成。等待過程中不可以被訊號或定時器喚醒,必須等待直到等待的事件發生。
僵死狀態:進程已終止,但進程描述符依然存在,直到父進程調用wait()函數後釋放。
停止狀態:進程因收到SIGSTOP、SIGSTP、SIGTIN、SIGTOU訊號後停止運行或者該進程正在被跟蹤(偵錯工具時,進程處於被跟蹤狀態)。
5.Linux進程的控制
Linux進程式控制制包括建立進程、執行新程式、退出進程以及改變進程優先順序等。
fork:用於建立一個新進程。
exit:用於終止進程。
exec:用於執行一個應用程式。
wait:將父進程掛起,等待子進程終止。
getpid:擷取當前進程的進程ID。
nice:改變進程的優先順序。
二、建立進程
#include<stdio.h>#include<sys/types.h>#include<unistd.h>int main(){ pid_t pid; printf("Process Creation Study\n"); pid=fork(); switch(pid) { case 0: printf("Child process is tunning,CurPid is %d,ParentPid is %d\n", pid,getppid()); break; case -1: printf("Process creation failed\n"); break; default: printf("Parent process is running,ChildPid is %d,ParentPid is %d\n", pid,getpid()); break; } exit(0); return 0;}一般情況下,函數最多有一個返回值,但fork函數非常特殊,它有兩個返回值,即調用一次返回兩次。成功調用fork函數後,當前進程實際上已經分裂成兩個進程,一個是原來的父進程,另一個是剛剛建立的子進程。父進程在調用fork函數的地方分開,fork函數有兩個返回值,一個是父進程調用fork函數後的返回值,該返回值是剛剛建立子進程的ID;另一個是子進程中fork函數的返回值,該返回值是0。
fork返回兩次的前提是進程建立成功,如果進程建立失敗,則只返回-1。
由圖可見,以上兩次運行結果都算父進程先運行。一般來說,fork之後是父進程先執行還是子進程先執行是不確定的,這取決於核心所使用的調度演算法。
父進程調用fork函數後的返回值是剛剛建立子進程的ID(3465),通過getpid函數得到父進程ID(3464)。
子進程調用fork函數後的返回值是0,子進程通過getppid函數得到父進程ID(3464)。
linux學習之八---Linux進程基礎知識