copy from: http://blog.sina.com.cn/s/blog_759dc36b0100p8y4.html
當運行任何一個UNIX命令時,shell至少會建立一個進程來運行這個命令,所以可以把任何在UNIX系統中啟動並執行程式叫做進程;但是進程並不是程式,進程是動態,而程式是靜態,並且多個進程可以並發的調用同一個程式。
系統中每一個進程都包含一個task_struct資料結構,所有指向這些資料結構的指標組成一個進程向量數組,系統預設的進程向量資料大小是512,表示系統中可同時容納512個進程。進程的task_struct資料結構包括了進程的狀態、調度資訊、進程標識符等資訊。
由於UNIX系統是一個多進程的作業系統,所以每一個進程都是獨立的,都有自己的許可權及任務,所以當某一進程失敗時並不會導致別的進程失敗。系統通過進程標識符來區分不同的進程,進程標識符是一個非負正數,他在任何時刻都是唯一的,當某個進程結束時,他的進程標識符可以分配給另外一個新進程。系統將標識符 0分配給調度進程,標識符1分配給初始化進程。
進程在運行期間,會用到很多資源,包括最寶貴的CPU資源,當某一個進程佔用CPU資源時,別的進程必須等待正在啟動並執行進程空閑CPU後才能運行,由於存在很多進程在等待,所以核心通過調度演算法來決定將CPU分配給哪個進程。
系統在剛剛啟動時,運行於核心方式,這時候只有一個初始化進程在運行,他首先做系統的初始化,然後執行初始化程式(一般是/sbin/init)。初始化進程是系統的第一個進程,以後所有的進程都是初始化進程的子進程。
2. 進程標識符管理
UNIX系統使用進程標識符來管理當前系統中的進程。為對具有某類似特性的進程統一管理,系統又引入了進程組的概念,以群組識別碼來區別進程是否同組。進程的群組識別碼是從父進程繼承下來的,所以,通常進程的群組識別碼就是和它相關聯的註冊進程的標識符。進程的標識符是由系統為之分配的,不能被修改;群組識別碼可通過setpgrp系統調用修改。
相關係統調用的格式如下:
#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);
說明:前三個系統調用分別返回調用進程的進程標識符、進程群組識別碼和其父進程標識符。它們總能成功地返回。第四個調用置進程群組識別碼,它將調用進程的進程群組識別碼改為調用進程的進程標識符,使其成為進程組首進程,並返回這一新的進程群組識別碼。
下面我們來看一個執行個體:
#include <stdio.h> #include <unistd.h> #include <stdlib.h>
int main(void) { printf( "PID = %dn", getpid() ); printf( "PPID = %dn", getppid() ); return 0; }
|
[root@localhost src]# gcc getpid.c [root@localhost src]# ./a.out PID = 4408 PPID = 3128 [root@localhost src]# |