一、什麼是進程?
一般來講,進程定義爲正在運行的程序的實例,簡單地說,進程就是一個正在運行的程序。
-
==程序== (program):通常爲二進制,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等), 爲實體文件的型態存在;
-
==進程== (process):程序被觸發後,運行者的權限與屬性、程序的程序碼與所需數據等都會被加載內存中, 操作系統並給予這個內存內的單元一個識別碼 (PID),可以說,進程就是一個正在運行中的程序。
進程不僅僅包含了正在運行的代碼,還包括了運行代碼所需要的各種資源。內核中使用進程控制塊PCB(process control block)管理一個進程的數據結構,每個進程都有一個PCB。
進程是資源所有資源分配的基本單位,線程則是CPU調度的基本單位。
二、多進程調度原理
在一個cpu上,可以存在多個進程,但是同一個時間段內,只能有一個進程工作。操作系統使用一定的算法管理所有進程,使得看起開像是併發執行,稱之爲“僞併發”;多核CPU可以實現真正意義上的併發。
三、進程環境與屬性
1、環境變量
(1)、命令行使用export查看本機支持的環境變量的名稱和內容
(2)在程序中獲取環境變量
每個進程都有一個環境表,存儲當前進程的環境變量。每個環境變量由“name=value”這樣的字符串組成。
進程環境表其實是一個字符串數組,用environ變量指向它。 每一個環境變量都是一個字符串,所有的環境變量構成字符串數組。環境表的內存佈局:
我們可以將所有的環境表中的變量打印出來:
#include <stdio.h>
int main(void)
{
extern char **environ; // 不用定義,聲明就能用 二重指針
int i = 0;
while (NULL != environ[i])
{
printf("%s\n", environ[i]);
i++;
}
return 0;
}
此外,操作系統還給我們提供了相關API,來幫助我們獲得與修改環境變量:
char * getenv(const char *name)--該函數用來獲取名字爲name的環境變量值,不存在時返回NULL。
int putenv(const char * string)--該函數用來改變或增加環境變量的內容。參數string的格式爲“name=value”,如果該環境變量已經存在則會覆蓋。
int setenv(const char *name, const char * value,int overwrite)--該函數用來改變或增加環境變量的內容。根據參數overwrite看是否覆蓋。
int unsetenv(const char *name)--清除某個環境變量。
舉例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *env_path = "PATH";//想要尋找的環境變量
char *env_value = NULL;//存儲環境變量的值
env_value = getenv(env_path);
if(NULL==env_value)
{
printf("not founf!\r\n");
}
printf("env_value:%s\r\n",env_value);
return 0;
}
2、進程自身屬性
一個進程除了能獲得操作系統提供的環境變量之外,還具備自身的屬性,主要包括:
- 進程號(PID:process ID),
- 父進程號(PPID parent PID),
- 進程組號(PGID:process group ID),操作系統允許對進程進行分組
- 真實用戶號(UID:user ID),用戶的唯一識別號,用於標識一個用戶
- 真實組號(GID:group ID),用戶組的唯一識別號,用於標識一個用戶組
- 有效用戶號(EUID:effective user ID),以其他用戶身份訪問文件使用
- 有效用戶組號(EGID:effective group ID),以其他用戶組身份訪問文件使用
(1)、命令行使用PS查看進程號
ps -aux查看所有進程
(2)在程序中獲取進程號
#include <sys/types.h>
#include <unistd.h>
- pid_t getpid(void);--獲取當前進程ID
- pid_t getppid(void);--獲取當前進程的父進程ID
- uid_t getuid(void);--獲取當前進程實際用戶ID
- uid_t geteuid(void);---獲取當前進程有效用戶ID
- gid_t getgid(vid);--獲取當前進程使用用戶組ID
- gid_t getegid(void);--獲取當前進程有效用戶組ID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t p1 = -1, p2 = -1;
p1 = getpid();
printf("pid = %d.\n", p1);
p2 = getppid();
printf("parent id = %d.\n", p2);
return 0;
}
REF: