Envp в execve () не имеет никакого эффекта - PullRequest
0 голосов
/ 10 октября 2018

Смысл этого кода в том, чтобы имитировать оболочку:

1) Запрашивать команду из стандартного ввода, пока не будет нажата комбинация клавиш CTRL + D или не введен «выход» в качестве ввода.

2) Разветвите процесс.

3) Родитель ожидает выполнения дочерней команды.

4) Дочерний выполняет команду.

5) Перейдите к 1

Execvpe работает (так как p указывает на PATH), но execve просто вызывает perror (), если я не наберу / bin /% command%.Что я делаю неправильно?Спасибо за помощь!

Вывод / bin / env внутри моей нанооболочки: PATH = / bin

  8 #define SIZE 50
  9 #define input fgets(buffer, SIZE, stdin)  
 10 #define exitcheck strcmp(strtok(buffer, "\n"), "exit")
 11 
 12 int main(int argc, char *argv) {
 13   char buffer[SIZE] = "echo";
 14   char* const command[] = {buffer, NULL};
 15   char* const envp[] = {"PATH=/bin", NULL};
 16 
 17   do {
 18     printf("nano-shell $ ");
 19     pid_t pid = fork();
 20     // Parent 
 21     if (pid > 0) {
 22       int status;
 23       waitpid(pid, &status, 0);
 24     } 
 25     // Child
 26     else if (pid == 0) {
 27       execve(command[0], command, envp);
 28       perror("Error: "); 
 29       _exit(1);
 30     } 
 31   } while(input != NULL && exitcheck != 0 );
 32   
 33    exit(EXIT_SUCCESS);
 34 }  

1 Ответ

0 голосов
/ 15 октября 2018

execve() не будет искать путь для поиска исполняемого файла.Другими словами, filename (т. Е. Первый аргумент) должен быть путем к файлу.

Что касается третьего аргумента, envp, с одной стороны, установка пути не имеет значения, поскольку это было упомянуто выше.Для другого, согласно странице руководства execve :

"Вектор аргумента и окружение могут быть доступны основной функции вызываемой программы, когда она определена как:

int main(int argc, char *argv[], char *envp[])

Обратите внимание, однако, что использование третьего аргумента для главной функции не указано в POSIX.1. "

То есть, envpскорее всего, не используется вообще после POSIX.1.Например, до тех пор, пока filename является абсолютным путем, даже если для envp установлено значение NULL как: char *envp[] = {NULL};, ваша программа все равно должна работать.

...