реализовать `executeUsingPATH ()` в C - PullRequest
0 голосов
/ 11 июля 2019

У меня есть вопрос, который заключается в следующем. Может кто-нибудь, пожалуйста, объясните мне?

Рассмотрим переменные среды, используемые в операционных системах на основе Unix. Часто встречающаяся переменная среды называется PATH и используется интерпретаторами команд или оболочками для определения имен каталогов, в которых выполняется поиск для поиска исполняемых программ. Например, типичное значение PATH может быть /Users/chris/bin:/usr/local/bin:/usr/bin:/bin:., что обеспечивает разделенный двоеточиями список каталогов для поиска требуемой программы.

Напишите функцию C99 с именем executeUsingPATH(), которая принимает имя программы для выполнения и вектор аргументов, заканчивающийся на NULL в конце этой программы. Запрашиваемая программа может быть указана с использованием только ее имени или с использованием абсолютного или относительного пути.

int executeUsingPATH(char *programName, char *arguments[]); Функция executeUsingPATH() должна пытаться выполнить programName с каждого каталог, предоставляемый через PATH, по порядку. Если programNam e найден и может быть выполнен (передавая ему указанные программные аргументы), функция должна дождаться завершения своего выполнения и затем вернуть состояние завершения завершенного процесса. Если функция не может найти и выполнить programName, то она должна просто вернуть целое число -1. Ваша функция не должна просто вызывать аналогичную библиотечную функцию с именем execvp().

Понятия не имею, как это реализовать.

1 Ответ

0 голосов
/ 15 июля 2019

Следует учитывать, что PATH может содержать пустые компоненты, которые обозначают текущий каталог. В общем, ваше задание довольно простое - см. Встроенные комментарии.

int executeUsingPATH(char *programName, char *arguments[])
{
    switch (fork())
    {           siginfo_t info;
    case -1:    return -1;  // failure
    case  0:    break;      // execute child below
    default:    waitid(P_ALL, 0, &info, WEXITED);
                return info.si_status;
    }
    // the following is executed in the child process
    char *path = getenv("PATH");
    char pathname[PATH_MAX];
    size_t n;
    for (; ; )
    {
        n = strcspn(path, ":");         // calculate directory name length
        strncpy(pathname, path, n);     // copy directory name to pathname
        path += n;                      // skip over directory name
        if (n) pathname[n++] = '/';     // append '/' unless name is empty
        strcpy(pathname+n, programName);// append name of a program
        execv(pathname, arguments);     // try to execute the program
        if (!*path++) exit(-1);         // failure if no more directories
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...