我有一个问题,如下。有人可以向我解释吗?

考虑在基于Unix的操作系统中使用的环境变量。常见的环境变量名为PATH,由命令解释器或shell用来标识要搜索以查找可执行程序的目录的名称。例如,PATH的典型值可以是/Users/chris/bin:/usr/local/bin:/usr/bin:/bin:.,它提供了一个用冒号分隔的目录列表,以搜索所需的程序。

编写一个名为executeUsingPATH()的C99函数,该函数接受要执行的程序的名称以及要传递给该程序的参数的NULL指针终止向量。所请求的程序可以仅使用其名称来指定,也可以使用绝对或相对路径名来指定。

int executeUsingPATH(char *programName, char *arguments[]);函数executeUsingPATH()应该尝试从每个目录执行programName
通过PATH提供的目录。如果找到programNam e并且可以执行(将指示的程序参数传递给它),则该函数应等待其执行终止,然后返回终止进程的退出状态。如果该函数无法找到并执行programName,则应仅返回整数-1.您的函数不应简单地调用名为execvp()的相似库函数。

我不知道如何实现它。

最佳答案

要考虑的一件事是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
    }
}

关于c - 在C中实现`executeUsingPATH()`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56981114/

10-15 02:19