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