日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程环境

發布時間:2025/7/14 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程环境 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  

進程環境


  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

總結

以上是生活随笔為你收集整理的进程环境的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。