- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为系统编程类(class)开发自定义 shell。我们被指示实现内置的 setenv()
和 unsetenv()
命令,并提示检查 putenv()
。
我的问题是
setenv(char*, char*, int)
和 putenv(char*)
似乎根本不起作用。我执行输入命令的代码如下:
//... 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()
设置一个新变量我的 printenv()
命令返回完全相同的东西,所以它似乎没有工作。
作为旁注,问题可能不在于函数或我如何调用它们,因为我的 shell 正在执行命令,就好像它必须格式化通配符(*
或 ?
) 我不确定应该发生什么。
最佳答案
在检查命令行之前,您似乎无条件地调用了 fork
。但是一些 shell 内置命令需要在 parent 进程中运行,以便它们的效果持续存在。所有操纵环境的内置函数都属于这一类。
顺便说一句,如果我正在编写 shell,我不会尝试使用 C 库的环境操作函数。我会使用三个参数 main
,将 envp
复制到我完全控制的数据结构中,然后将其反馈给 execve
。这部分是因为我是一个控制狂,部分是因为它几乎不可能用 setenv
和/或 putenv
做任何复杂的事情并且没有内存泄漏。参见 this older SO question血淋淋的细节。
关于c++ - setenv, unsetenv, putenv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7669409/
在我的 apache 实例上,它设置了一个环境变量 APP_ENV=development。我正在尝试在我的 PHP 端动态更改此设置(在启动测试套件的实例中),如下所示: putenv('APP_E
我正在尝试使用 GCC 4.7.1 (MinGW) 在 Windows 上编译 Qt 4.8.4。我编辑了 mkspec 以包含 C++11 特性(添加了 -std=c++11 标志)来编译 Java
当 php用作 apache模块,来自 apache 的环境变量 SetEnv指令可用于 php 的 getenv() , 但它似乎不适用于 C通过 stdlib 的 getenv() 扩展.至少它发
我在这里阅读了几篇文章,但仍然对 setenv() 的方式感到困惑作品: linux-where-are-environment-variables-stored where-is-the-envir
编辑:据我所知,我的问题是由于 PHP 的缺陷造成的。我已将此问题复制到 PHP 错误跟踪器:https://bugs.php.net/bug.php?id=74143并计划尝试实现修复。 puten
函数 putenv 不是线程安全函数,所以我想如果我在调用 putenv 之前调用 pthread_mutex_lock,我可以让 putenv 这样“线程安全”? 我试过了,但是当我运行它的时候,出
我需要用户在文本文件中定义我的程序所需的所有环境变量,如下所示。 MyDLLPath = C:\MyDLLPath 我的选项 = 选项 1 PATH = %MyDLLPath%;%PATH%; 在我的
我正在为系统编程类(class)开发自定义 shell。我们被指示实现内置的 setenv() 和 unsetenv() 命令,并提示检查 putenv()。 我的问题是 setenv(char*,
POSIX 系统调用 putenv 声明分配的内存字符串在调用 putenv 后不能被调用者释放。因此,您不能使用自动变量调用 putenv。 例子: #include #include #inc
putenv函数接受一个参数,一个字符串。此字符串应采用以下格式:KEY=VALUE . 引用:http://php.net/manual/en/function.putenv.php 将以下代码作为
我提前为一些代码转储道歉,我已经尽可能多地修剪了不重要的代码: // Global vars / mutex stuff extern char **environ; pthread_mutex_t
我正在学习 Laravel。我使用 WinNMP 安装了 php 7、mysql 和 nginx。我安装了composer,并通过它安装了laravel cli(Laravel\Installer)。
我需要从用户那里获取输入并处理变量。我需要具备以下功能: set varname = somevalue:将名为varname的环境变量的值设置为somevalue指定的值。 delete varna
在 php 中,运行: echo shell_exec("export http_proxy=http://myproxy.com:8080 2>&1"); echo shell_exec("env
尝试运行以下在 VS2012 中编译的代码时,我似乎遇到了内存损坏。 它在 VS2010 和以前的版本中工作正常: char *var1 = getenv("var1"); // Value for
我正在尝试在使用 g++ 编译的程序中使用 putenv stdlib 函数,包括标志和警告 - std=c++11 和 -Wall -Wextra。 程序可以像下面这样简单: #include #i
我尝试在 Ubuntu 13.04(64 位)上使用 gcc 4.7.3 和 clang 3.2.1 编译以下代码: #include #include #include int main()
我一直在思考环境变量,并有一些问题/意见。 putenv(char *string); 这个调用似乎有致命的缺陷。因为它不复制传递的字符串,所以你不能用本地调用它,并且不能保证堆分配的字符串不会被覆盖
我试图通过在此之前连接 str1 和 str2 在 UNIX 上使用 putenv() 。 我想在环境中添加一个变量或修改一个变量,所以我调用 putenv() (或者我可以调用 setenv() 相
pytest 的 monkeypatch模块提供了一个setenv 函数,它将设置环境变量名称为值。 为什么monkeypatch 提供这个?听起来和os.putenv一样?它提供了 prepend
我是一名优秀的程序员,十分优秀!