進程狀態與環境變量的解析
阿新 • • 發佈:2017-08-12
avi .net 標識符 時間 每一個 file term clu 代碼實現
2、環境變量的獲取
要怎麽樣,。得到一個進程的環境變量呢??、
在這裏我想大家介紹三種方法:
我們來驗證一下吧!!
結果中局部變量m的地址在 環境變量PATH的低地址處,。,所以結論是正確的。。
最後的執行結果:
結果非常明顯,當父進程結束之後。子進程的父進程的pid變成了 1號進程。
實現結果:
當前的子進程就變成了是 僵屍狀態。
主要內容 :
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函數。
#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、僵屍進程
這類進程就是。就是子進程已經結束 。可是父進程還在執行沒有結束。。無法回收子進程,所以此時的子進程就屬於是僵屍進程。 【進程演示 】實現結果:
當前的子進程就變成了是 僵屍狀態。
進程狀態與環境變量的解析