【進程】進程管理

查看進程

1. ps

查看某個時間點的進程信息。git

示例一:查看本身的進程github

# ps -l

示例二:查看系統全部進程shell

# ps aux

示例三:查看特定的進程函數

# ps aux | grep threadx

2. pstree

查看進程樹。spa

示例:查看全部進程樹blog

# pstree -A

3. top

實時顯示進程信息。隊列

示例:兩秒鐘刷新一次進程

# top -d 2

4. netstat

查看佔用端口的進程事件

示例:查看特定端口的進程資源

# netstat -anp | grep port

進程狀態

狀態 說明
R running or runnable (on run queue)
正在執行或者可執行,此時進程位於執行隊列中。
D uninterruptible sleep (usually I/O)
不可中斷阻塞,一般爲 IO 阻塞。
S interruptible sleep (waiting for an event to complete) 
可中斷阻塞,此時進程正在等待某個事件完成。
Z zombie (terminated but not reaped by its parent)
僵死,進程已經終止可是還沒有被其父進程獲取信息。
T stopped (either by a job control signal or because it is being traced) 
結束,進程既能夠被做業控制信號結束,也多是正在被追蹤。

 

 

 

SIGCHLD

當一個子進程改變了它的狀態時(中止運行,繼續運行或者退出),有兩件事會發生在父進程中:

  • 獲得 SIGCHLD 信號;
  • waitpid() 或者 wait() 調用會返回。

其中子進程發送的 SIGCHLD 信號包含了子進程的信息,好比進程 ID、進程狀態、進程使用 CPU 的時間等。

在子進程退出時,它的進程描述符不會當即釋放,這是爲了讓父進程獲得子進程信息,父進程經過 wait() 和 waitpid() 來得到一個已經退出的子進程的信息。

 

 

wait()

pid_t wait(int *status)

父進程調用 wait() 會一直阻塞,直到收到一個子進程退出的 SIGCHLD 信號,以後 wait() 函數會銷燬子進程並返回。

若是成功,返回被收集的子進程的進程 ID;若是調用進程沒有子進程,調用就會失敗,此時返回 -1,同時 errno 被置爲 ECHILD。

參數 status 用來保存被收集的子進程退出時的一些狀態,若是對這個子進程是如何死掉的絕不在乎,只想把這個子進程消滅掉,能夠設置這個參數爲 NULL。

waitpid()

pid_t waitpid(pid_t pid, int *status, int options)

做用和 wait() 徹底相同,可是多了兩個可由用戶控制的參數 pid 和 options。

pid 參數指示一個子進程的 ID,表示只關心這個子進程退出的 SIGCHLD 信號。若是 pid=-1 時,那麼和 wait() 做用相同,都是關心全部子進程退出的 SIGCHLD 信號。

options 參數主要有 WNOHANG 和 WUNTRACED 兩個選項,WNOHANG 可使 waitpid() 調用變成非阻塞的,也就是說它會當即返回,父進程能夠繼續執行其它任務。

孤兒進程

一個父進程退出,而它的一個或多個子進程還在運行,那麼這些子進程將成爲孤兒進程。

孤兒進程將被 init 進程(進程號爲 1)所收養,並由 init 進程對它們完成狀態收集工做。

因爲孤兒進程會被 init 進程收養,因此孤兒進程不會對系統形成危害。

殭屍進程

一個子進程的進程描述符在子進程退出時不會釋放,只有當父進程經過 wait() 或 waitpid() 獲取了子進程信息後纔會釋放。若是子進程退出,而父進程並無調用 wait() 或 waitpid(),那麼子進程的進程描述符仍然保存在系統中,這種進程稱之爲殭屍進程。

殭屍進程經過 ps 命令顯示出來的狀態爲 Z(zombie)。

系統所能使用的進程號是有限的,若是產生大量殭屍進程,將由於沒有可用的進程號而致使系統不能產生新的進程。

要消滅系統中大量的殭屍進程,只須要將其父進程殺死,此時殭屍進程就會變成孤兒進程,從而被 init 進程所收養,這樣 init 進程就會釋放全部的殭屍進程所佔有的資源,從而結束殭屍進程。

相關文章
相關標籤/搜索