linux進程(一)——什麼是進程?

一、什麼是進程?

一般來講,進程定義爲正在運行的程序的實例,簡單地說,進程就是一個正在運行的程序。

  • ==程序== (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:

https://blog.csdn.net/u013733747/article/details/80875956

https://www.cnblogs.com/iamwho/p/10619633.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章