首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setenv,unsetenv,putenv

setenv,unsetenv,putenv
EN

Stack Overflow用户
提问于 2011-10-06 01:09:18
回答 2查看 9.7K关注 0票数 5

我正在为一个系统编程类开发一个自定义shell。指示我们实现内置的setenv()unsetenv()命令,并提示putenv()检查手册页。

我的问题是,setenv(char*, char*, int)putenv(char*)似乎根本不起作用。我输入的执行命令的代码如下:

代码语言:javascript
复制
//... skipping past stuff for IO redirection
pid = fork();
if(pid == 0){
    //child
    if(!strcmp(_simpleCommands[0]->_arguments[0],"printenv")){
        //check if command is "printenv"
        extern char **environ;
        int i;
        for(i = 0; environ[i] != NULL; i++){
            printf("%s\n",environ[i]);
        }
        exit(0);
    }
    if(!strcmp(_simpleCommands[0]->_arguments[0],"setenv")){
        //if command is "setenv" get parameters char* A, char* B
        char * p = _simpleCommands[0]->_arguments[1];
        char * s = _simpleCommands[0]->_arguments[2];

        //putenv(char* s) needs to be formatted A=B; A is variable B is value
        char param[strlen(p) + strlen(s) + 1];
        strcat(param,p);
        strcat(param,"=");
        strcat(param,s);
        putenv(param);
        //setenv(p,s,1);
        exit(0);
    }
    if(!strcmp(_simpleCommands[0]->_arguments[0],"unsetenv")){
        //remove environment variable
        unsetenv(_simpleCommands[0]->_arguments[0]);
        exit(0);
    }
    //execute command
    execvp(_simpleCommands[0]->_arguments[0],_simpleCommands->_arguments);
    perror("-myshell");
    _exit(1);
}

//omitting restore IO defaults...

如果我运行printenv,它会正常工作,但是如果我尝试使用putenv()setenv()设置一个新变量,那么它将返回完全相同的内容,因此它似乎无法工作。

顺便提一句,问题可能不是函数或我如何调用它们,因为我的shell正在执行命令,好像它必须格式化通配符(*?),但我不确定是否应该这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-06 02:48:56

在检查命令行之前,您似乎是无条件地调用fork。但是一些shell内置命令需要在父进程中运行,这样它们的效果才会持续。所有操作环境的内置程序都属于这个类别。

顺便说一句,如果我编写一个shell,我不会尝试使用C库的环境操作函数。我使用三参数main,将envp复制到完全控制下的数据结构中,然后将其反馈到execve中。这部分是因为我是一个控制狂,部分是因为我几乎不可能用setenv和/或putenv做任何复杂的事情,而且不会有内存泄漏。有关血淋淋的细节,请参见this older SO question

票数 6
EN

Stack Overflow用户

发布于 2011-10-06 01:39:42

你凭什么认为它不起作用?我编写了一个简单的测试用例below...and,它按预期工作。

确保在相同的进程中调用setevn和prientevn。

代码语言:javascript
复制
#include <stdlib.h>
#include <assert.h>
int main()
{


 char * s= "stack=overflow";

 int ret =  putenv(s);

 assert(ret == 0);

 //printout all the env
 extern char **environ;
        int i;
        for(i = 0; environ[i] != NULL; i++){
            printf("%s\n",environ[i]);
        }


 return 0; 

}
pierr@ubuntu:~/workspace/so/c/env$ ./test | grep stack
stack=overflow
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7669409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档