1、什么是進(jìn)程
當運行任何一個(gè)UNIX命令時(shí),shell至少會(huì )建立一個(gè)進(jìn)程來(lái)運行這個(gè)命令,所以可以把任何在UNIX系統中運行的程序叫做進(jìn)程;但是進(jìn)程并不是程序,進(jìn)程是動(dòng)態(tài)的,而程序是靜態(tài)的,并且多個(gè)進(jìn)程可以并發(fā)的調用同一個(gè)程序。
系統中每一個(gè)進(jìn)程都包含一個(gè)task_struct數據結構,所有指向這些數據結構的指針組成一個(gè)進(jìn)程向量數組,系統缺省的進(jìn)程向量數據大小是512, 表示系統中可同時(shí)容納512個(gè)進(jìn)程。進(jìn)程的task_struct數據結構包括了進(jìn)程的狀態(tài)、調度信息、進(jìn)程標識符等信息。
由于 UNIX系統是一個(gè)多進(jìn)程的操作系統,所以每一個(gè)進(jìn)程都是獨立的,都有自己的權限及任務(wù),所以當某一進(jìn)程失敗時(shí)并不會(huì )導致別的進(jìn)程失敗。系統通過(guò)進(jìn)程標識 符來(lái)區分不同的進(jìn)程,進(jìn)程標識符是一個(gè)非負正數,他在任何時(shí)刻都是唯一的,當某個(gè)進(jìn)程結束時(shí),他的進(jìn)程標識符可以分配給另外一個(gè)新進(jìn)程。系統將標識符 0分配給調度進(jìn)程,標識符1分配給初始化進(jìn)程。
進(jìn)程在運行期間,會(huì )用到很多資源,包括最寶貴的CPU資源,當某一個(gè)進(jìn)程占用CPU資源時(shí),別的進(jìn)程必須等待正在運行的進(jìn)程空閑CPU后才能運行,由于存在很多進(jìn)程在等待,所以?xún)群送ㄟ^(guò)調度算法來(lái)決定將CPU分配給哪個(gè)進(jìn)程。
系統在剛剛啟動(dòng)時(shí),運行于內核方式,這時(shí)候只有一個(gè)初始化進(jìn)程在運行,他首先做系統的初始化,然后執行初始化程序(一般是/sbin/init)。初始化進(jìn)程是系統的第一個(gè)進(jìn)程,以后所有的進(jìn)程都是初始化進(jìn)程的子進(jìn)程。
2. 進(jìn)程標識符管理
UNIX系統使用進(jìn)程標識符來(lái)管理當前系統中的進(jìn)程。為對具有某類(lèi)似特性的進(jìn)程統一管理,系統又引入了進(jìn)程組的概念,以組標識符來(lái)區別進(jìn)程是否同組。進(jìn) 程的組標識符是從父進(jìn)程繼承下來(lái)的,所以,通常進(jìn)程的組標識符就是和它相關(guān)聯(lián)的注冊進(jìn)程的標識符。進(jìn)程的標識符是由系統為之分配的,不能被修改;組標識符 可通過(guò)setpgrp系統調用修改。
相關(guān)系統調用的格式如下:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getpgrp(void);
pid_t getppid(void);
pid_t getpgid(pid_t pid);
說(shuō)明:前三個(gè)系統調用分別返回調用進(jìn)程的進(jìn)程標識符、進(jìn)程組標識符和其父進(jìn)程標識符。它們總能成功地返回。第四個(gè)調用置進(jìn)程組標識符,它將調用進(jìn)程的進(jìn)程組標識符改為調用進(jìn)程的進(jìn)程標識符,使其成為進(jìn)程組首進(jìn)程,并返回這一新的進(jìn)程組標識符。
下面我們來(lái)看一個(gè)實(shí)例:
#include <stdio.h> #include <unistd.h> #include <stdlib.h>
int main(void)
{ printf("pid=%d\n",getpid());/* 獲取當前進(jìn)程標志符 */ printf("pgrp=%d\n",getpgrp());/* 獲取當前進(jìn)程組標識符 */ printf("ppid=%d\n",getppid());/* 獲取當前進(jìn)程的父進(jìn)程標識符 */ printf("pgid=%d\n",getpgid(getpid())); } $gcc -o getpid getpid.c $./getpid pid=6552 pgrp=6552 ppid=6215 pgid=6552 $
|