进程环境
進程環境
libc中定義的全局變量environ指向環境變量表,environ沒有包含在任何頭文件中,所以在使用時要用extern聲明。例如:
#include <stdio.h>
int main(void)
{
extern char **environ;
int i;
for(i=0; environ[i]!=NULL; i++)
printf("%s\n", environ[i]);
return 0;
}
?
由于父進程在調用fork創建子進程時會把自己的環境變量表也復制給子進程,所以a.out(編譯以上程序所生成的應用程序)打印的環境變量和Shell進程的環境變量是相同的。
按照慣例,環境變量字符串都是name=value這樣的形式,大多數name由大寫字母加下劃線組成,一般把name的部分叫做環境變量,value的部分則是環境變量的值。環境變量定義了進程的運行環境,一些比較重要的環境變量的含義如下:
PATH
* 可執行文件的搜索路徑。ls命令也是一個程序,執行它不需要提供完整的路徑名/bin/ls,然而通常我們執行當前目錄下的程序a.out卻需要提供完整的路徑名./a.out,這是因為PATH環境變量的值里面包含了ls命令所在的目錄/bin,卻不包含a.out所在的目錄。PATH環境變量的值可以包含多個目錄,用:號隔開。在Shell中用echo命令可以查看這個環境變量的值:
$ echo $PATH
SHELL
* 當前Shell,它的值通常是/bin/bash。
TERM
* 當前終端類型,在圖形界面終端下它的值通常是xterm,終端類型決定了一些程序的輸出顯示方式,比如圖形界面終端可以顯示漢字,而字符終端一般不行。
LANG
* 語言和locale,決定了字符編碼以及時間、貨幣等信息的顯示格式。
HOME
* 當前用戶主目錄的路徑,很多程序需要在主目錄下保存配置文件,使得每個用戶在運行該程序時都有自己的一套配置。
用environ指針可以查看所有環境變量字符串,但是不夠方便,如果給出name要在環境變量表中查找它對應的value,可以用getenv函數。
#include <stdlib.h>
char *getenv(const char *name);
getenv的返回值是指向value的指針,若未找到則為NULL。
修改環境變量可以用以下函數
#include <stdlib.h>
int setenv(const char *name, const char *value, int rewrite);
void unsetenv(const char *name);
putenv和setenv函數若成功則返回為0,若出錯則返回非0。
setenv將環境變量name的值設置為value。如果已存在環境變量name,那么:
若rewrite非0,則覆蓋原來的定義;
若rewrite為0,則不覆蓋原來的定義,也不返回錯誤。
unsetenv刪除name的定義。即使name沒有定義也不返回錯誤。
例:修改環境變量
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
printf("PATH=%s\n", getenv("PATH"));
setenv("PATH", "hello", 1);
printf("PATH=%s\n", getenv("PATH"));
return 0;
}
//fork--------------------------------------------------------------------------
#include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(void) {pid_t pid;int n = 0;printf("this is a test\n");/**上面的語句如果沒有\n那么就會在子進程中也打印一句*這個是由于printf的機制造成的,遇到\n就出棧,*若沒有\n那么會在執行下一條語句前出棧,*而下一條語句是fork,此時已經復制主進程的環境,其中包括打印*/pid = fork();//調用fork時,子進程會從下面的語句開始執行if(pid > 0){while(1){n = 10;//兩個n的值是不一樣的,那是因為讀時共享,寫時復制printf("I am parent n = %d , &n = %p\n",n,&n);sleep(2);}}else if(pid == 0){while(1){//兩個n的地址是一樣的,那是因為虛擬地址一樣的原因//但是n的值是不一樣的,那是因為讀時共享,寫時復制printf("I am child n = %d , &n = %p\n",n,&n);sleep(2);}}else{perror("fork");exit(1);}return 0; }
?
轉載于:https://www.cnblogs.com/13224ACMer/p/6384904.html
總結
- 上一篇: php面向对象(OOP)---- 验证码
- 下一篇: Django H2 文档查看