我正在用 C 制作我自己的 shell,我被要求用函式 putenv(char*) 修改環境變數,我已經實作了這個代碼:
char *string = NULL;
if ((string = (char *)malloc(strlen(tokens[2]) strlen(tokens[3]) 2)) == NULL){
perror("Error malloc");
return 0;
}
strcpy(string, tokens[2]);
strcat(string, "=");
strcat(string, tokens[3]);
putenv(string);
token[2] 和 tokens[3] 分別是變數的名稱和我想給它的新值。我的問題是,只有當我要求從 extern char **environ 中列出環境時,這才有效,但是,當我從 main (char *envp[]) 的第三個引數中列出它時,cange 似乎不起作用。
有誰知道如何告訴 putenv() 函式在兩者中更改它?
我使用的兩種列出環境的方法是:
void ShowEnviroment (char **enviroment, char * name_enviroment)
{
int i=0;
while (enviroment[i]!=NULL) {
printf ("%p->%s[%d]=(%p) %s\n", &enviroment[i],
name_enviroment, i, enviroment[i], enviroment[i]);
i ;
}
}
引數enviroment可以是environ(定義為extern char **environ)(它作業正常)或&envp(main 的第三個引數)(似乎沒有顯示變化的那個)
uj5u.com熱心網友回復:
您的程式運行良好,并且符合預期。envp是environ程式開始時的副本,并且可能與 不同environ,之后永遠不會更新。
要運行命令,外殼程式(例如您正在撰寫的外殼程式)使用fork() execv()-- 和手冊上的execv注釋的組合
對于那些不包含 envp 指標的表單(execl()、execv()、execlp() 和 execvp()),新行程映像的環境應從呼叫行程中的外部變數 environ 中獲取。
......讓根本沒有提及依靠在envp您收到,而不是一個你可以制造,傳遞你選擇你的子行程取其環境變數使用時exec*的變體也需要修改環境變數作為自變數。
作為旁注, using 比setenv()有兩個優點putenv,因此我會推薦它:
- 無論你傳遞給什么,都
putenv必須在時間里堅持;您傳遞給的任何內容setenv都會被復制,因此您無需管理其記憶體。 - 因此,
setenv(char *key, char *value, int replace)意味著對您的責任更少(并且不需要 malloc、strcat 等)。
兩者都會environ為您修改。請注意,您不應該environ直接撰寫(但閱讀它是可以的,并且需要,因為沒有列出可用環境變數的lsenv函式);注意這個警告:
任何直接修改環境變數指向的指標的應用程式都具有未定義的行為
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372611.html
