2012-01-01 3 views
0

Так я работаю над небольшим проектом, и у меня есть эта функция:Проверка другой каталог для программы

void call_execve(char *cmd) 
{ 
    int i; 
    char bin[5]; 
    char full_cmd[100]; 

    strcpy(bin, "/bin/"); 

    strcat(full_cmd, bin); 
    strcat(full_cmd, cmd); 

    if(fork() == 0) { 
     i = execve(full_cmd, my_argv, my_envp); 
     if(i < 0) { 
      printf("%s: %s\n", full_cmd, "command not found"); 
      exit(1);   
     } 
    } else { 
     wait(NULL); 
    } 
} 

Я предполагаю, что мой мозг просто не думает сегодня, что мне нужно сделать это проверить/usr/bin для команды программы или оболочки.

Я знаю, что могу использовать переменную $ PATH, но я не уверен, как работать с ней с помощью языка C. Было бы здорово, если бы вы могли бы переписать эту функцию либо выполнить программу из каталога/USR/бен или использовать $ PATH, чтобы выполнить программу

Спасибо заранее.

GeissT.

+2

'char bin [5];' недостаточно места для ''/bin/"'. В 'strcat (full_cmd, ...)' calls 'full_cmd' имеет недопустимое значение (оно не было инициализировано) – pmg

+0

Но/bin/есть 5 символов? Или косые черты добавляют еще несколько символов? –

+1

есть завершающий '' \ 0'' во всех строках. – pmg

ответ

0

В execvp библиотечные функции подражает поиска оболочки внутри $PATH, а затем вызвать execve.

Если вы хотите, наоборот, чтобы выполнить программу, в которой путь к файлу вам известен (например, /usr/bin/mail), то просто позвоните execve с указанием полного пути в качестве первого имени файла аргумента.

+0

Хорошо, поэтому, если я позволю пользователю ввести команду, например _ls_ или _make_, то будет ли _execvp_ искать программу в необходимых каталогах, просто передав ей команду? –

+0

'execvp' (или' execve' или другие 'exec *' функции) не имеет ничего общего с тем, что пользователь вводит. Это функция для выполнения программы. И с 'execvp' и связанными функциями, поиск' $ PATH' выполняется, но с 'execve' это не так. –

+0

Что я имею в виду, могу ли я называть ** execvp (full_cmd) **? И передать существующие аргументы? –

1

На странице exec(3) человек:

В execlp(), execvp() и execvpe() функции дублируют действия оболочки в поисках исполняемого файла, если указанное файл- имя не содержит косой черты (/) персонаж. Файл запрашивается в списке , разделенном двоеточиями, с именами каталогов, указанными в переменной окружения PATH.

+0

Хорошо, поэтому, если я использую функцию _execlp() _, он будет искать в каталогах $ PATH? –

+1

@GeissT: * Любые * функции 'exec * p *()' будут искать '$ PATH', если в команде не указан путь. –

+0

О, ладно, спасибо. Поэтому я могу просто передать _exec * p * _ команду, которая введена без необходимости в каталоге? –

Смежные вопросы