1. 程式人生 > >進程狀態與環境變量的解析

進程狀態與環境變量的解析

avi .net 標識符 時間 每一個 file term clu 代碼實現

主要內容 :

1、main函數下的命令行參數

2、環境變量的獲取;

3、驗證進程中環境變量的存儲位置

4、進程執行的狀態

1、命令行參數

在學習C語言的時候,我們已經大致了解到了命令行參數的使用; 今天我們在Linux系統下。來看看這些參數的使用; 我們都知道main函數是有參數的: main函數的格式: int main(intargc ,char * argv[],char* env) 當中參數env表示的進程的環境變量 。

。。 前兩個表示的就是 argc 表示的命令的個數 argv[]表示的是命令(字符串)的集合 我們來驗證一下吧 !

!!

我們能夠下一個代碼來檢驗一下吧 !!

#include<stdio.h>
#include<stdlib.h>
int main(int argc ,char  *  argv[],char *env[])
{
     int i = 0 ;
     for(i =0 ;i < argc;++i)
     {
        printf("%s ",argv[i]);

      }
    printf("\n");
    return 0;
}
在Linux下得到的結果 !

技術分享

2、環境變量的獲取

要怎麽樣,。得到一個進程的環境變量呢??、 在這裏我想大家介紹三種方法:

1)、使用第三個命令行參數env

獲取的方法: 命令行參數env 類型是 指針數組 內部存放的就是 環境變量 最後以NULL結束 代碼來展示一下吧!
#include<stdio.h>
#include<stdlib.h>
int main(int argc ,char  *  argv[],char *env[])
{
      int i = 0;
      for(i= 0 ;env[i];++i)
      {
    
         printf("%s\n ",env[i]);         

     }
    printf("\n");

    return 0;
}

2)、使用全局變量environ

C庫中定義的全局變量environ指向環境變量表,environ沒有包括在不論什麽頭文件裏,所以在使用時 要用extern聲明。


#include <stdio.h>
int main()
{
	extern char **environ;
	int i=0;
	for(;environ[i]!=NULL;i++){
		printf("%s\n",environ[i]);
	}
	return 0;
}

3)、使用環境變量的獲取函數

上面的environ指針,還有命令行參數env 能夠查看全部環境變量字符串,可是不夠方便, 假設給出name要在環境變量表中查 找它相應的value,能夠用getenv函數。


函數 getenv(環境變量名) getenv的返回值是指向value的指針,若未找到則為NULL;

#include <stdio.h>
#include <stdlib.h>
int main()
{
	//方法三:使用函數getenv(環境變量名)
     	char * name  = getenv("PATH");
     	printf("%s\n",name);
	return 0;
}

進程中環境變量的存儲位置

對於一個進成來說的、系統為該進程分配的內存大致都是這麽幾部分???? 技術分享

我們來驗證一下吧!!

我們都知道對於代碼定義的局部變量都是定義在 堆棧段。,, 那麽我們僅僅須要推斷一下、環境變量的地址 究竟是在 局部變量的 高低址還是低地址 代碼實現

#include <stdio.h>
#include <stdlib.h>
int main()
{
	//查看環境變量在內存重點額存放位置 
        //基本的區域有:  代碼段、靜態區(初始化數據、未初始化數據)、堆、棧、未知區域
        int m = 0 ;
        printf("&m = %p\n",&m);
        printf("&path =%p \n",&*env[0]);

	return 0;
}
最後的結果: 技術分享
結果中局部變量m的地址在 環境變量PATH的低地址處,。,所以結論是正確的。。

3、進程狀態

對於內存中 ,同一時間肯定不僅僅有一個進程,可是這麽多的進程肯定不是處於執行的狀態; 所以對於每一個進程的PCB中都會包括一個 狀態標識符 對於進程來說、、、主要有以下這幾種的狀態: 1、R (running) 執行狀態 、、、表示的是 當前進程在 執行隊列中 2、S (sleeping) 休眠狀態、、、進程運行休眠的代碼 3、D (disk sleep) 特殊的一種休眠狀態 。;; 4、T (stopped) 停止狀態 ,進程此時什麽都不須要做 5、t (tracing stop) 該狀態暫不解釋 6、X (dead) 死亡狀態。表示進程正在被父進程回收 7、Z (zombie) 僵屍狀態 ,,,,表示的進程發生異常--------進程被回收 這段時間之內的狀態

狀態 S(sleeping)、D(disk sleep)、T(stopped)之間的不同之處

S狀態:淺度的休眠,進程此時運行的休眠的代碼,可被系統喚醒; D狀態:深度的休眠,進程進入到深度的睡眠狀態,僅僅能自己將自己喚醒 ,進程一般在進行I/O的時候。狀態會改變成是D狀態,此狀態下的進程不會被不論什麽信號殺死。 T狀態:停止狀態,該狀態下的進程什麽都不做 ;

進程狀態的轉換圖

技術分享

4、特殊的進程的解析

我們常常會聽到一些特別進程,以下我就來向大家解釋這麽兩個特別的進程

1、孤兒進程

所謂的孤兒進程就是 父進程已經結束了,子進程被1號進程收養的進程 【進程演示 】 我們來實際演示一下這個進程: 以下是測試代碼 技術分享
最後的執行結果: 技術分享
結果非常明顯,當父進程結束之後。子進程的父進程的pid變成了 1號進程。

2、僵屍進程

這類進程就是。就是子進程已經結束 。可是父進程還在執行沒有結束。。無法回收子進程,所以此時的子進程就屬於是僵屍進程。 【進程演示 】 技術分享


實現結果: 技術分享
當前的子進程就變成了是 僵屍狀態。

進程狀態與環境變量的解析