execv работает для "/ bin / ls", но не для "pwd" - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в языке программирования C на Unix и пытаюсь создать подобную оболочке программу на C. Однако программа выдает ошибку, если я пытаюсь изменить функцию в соответствии с моими собственными выборами. Например, как кажется, / bin / ls -l работает, но pwd не . Это может быть просто, но я не мог понять проблему.

if (fork() == 0)
{
    char* argv[3];
    argv[0] = "/bin/ls";
    argv[1] = "-l";
    argv[2] = NULL;

    if(execv(argv[0], argv)==-1)
        printf("Error in calling exec!!");

    printf("I will not be printed!\n"); 
}

Эта функция работает. Я ясно вижу результаты на оболочке. Однако, если я хочу измениться, это выдает ошибку.

if(fork() == 0){
   char * argv[2];

   argv[0] = "pwd";
   argv[1] = NULL;

   if(execv(argv[0], argv) == -1)
       printf("Error in calling exec!");
    }

1 Ответ

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

Функция execv не ищет путь для запуска команды, поэтому она не может найти pwd. Он может найти ls, поскольку вы указали полный путь к исполняемому файлу. Вместо этого используйте execvp, который выполняет поиск пути.

Кроме того, используйте perror для печати сообщений об ошибках для функции библиотеки / системы. Он скажет вам, почему функция не сработала.

if(execvp(argv[0], argv) == -1)
    perror("Error in calling exec!");
...