我有一个问题,如下。有人可以向我解释吗?
考虑在基于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/