Доступ и запуск / usr / bin программ на C - PullRequest
2 голосов
/ 05 мая 2019

Какой самый эффективный способ запуска программ из каталога /usr/bin в программе на C? Мне поручено получить пользовательский ввод, и если пользовательский ввод совпадает с программой в bin, запускаю соответствующую программу.

У меня была идея бросить имена всех программ bin в текстовый файл и использовать цикл для итерации по каждому слову в файле, сравнивая его со входными данными. Тем не менее, я подумал, что это может быть немного изобретать колесо. Есть ли оптимизированные способы сделать это?

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

«Классический» способ вызова программы из существующего процесса в любой из UNIX-подобных ОС заключается в использовании одной из exec() функций . Когда вы прочитаете о exec(), большинство учебников начнется с объяснения другой функции: fork(). Эти функции очень обычно используются вместе, но не слишком зацикливайтесь на этом, потому что они оба полезны сами по себе.

Чтобы ответить на ваш вопрос, достаточно эффективный способ сделать то, что вы ищете:

  1. Возьмите сгенерированный пользователем ввод из того, что случилось с вашим источником
  2. (Опционально, звоните fork())
  3. вызов функции execvp()
  4. То, что вы будете здесь делать, будет зависеть от того, позвонили ли вы fork() на шаге (2) и что вы намерены делать (если что-нибудь) после выполнения описанной вами задачи.

execvp () сделает всю работу за вас, автоматически найдя в вашей среде PATH имя файла, соответствующее первому аргументу. Если в текущей среде не задана переменная PATH, по умолчанию будет /bin:/usr/bin. Поскольку единственный способ, которым вызов exec() может вернуть возвращаемое значение, - это когда этот вызов не удался, вы можете проверить значение errno как часть шага (4). В случае, если пользовательский ввод не соответствует ни одному исполняемому файлу в среде PATH, errno будет установлен на ENOENT. Как именно вы это сделаете, и какие дополнительные шаги стоит предпринять, будет зависеть от того, ответили вы или нет, а также от дополнительных требований к вашей программе.

0 голосов
/ 05 мая 2019

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

https://linux.die.net/man/3/system

#include <stdlib.h>
int system(const char *command);

т.е.

FILE *file;
if (file = fopen(userinput, "r")){
    fclose(file);
    system(userinput);
}
...