linux學習之八---Linux進程基礎知識

來源:互聯網
上載者:User

標籤: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進程基礎知識

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.