Я работаю над пользовательской оболочкой для класса системного программирования.Нам было поручено реализовать встроенные команды 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()
my *Команда 1016 * возвращает точно такую же вещь, поэтому она, похоже, не работает.
В качестве примечания, проблема может заключаться не в функциях или в том, как я их вызвал, потому что моя оболочка выполняет командыкак будто он должен был отформатировать подстановочный знак (*
или ?
), что, я не уверен, должно произойти.