我正在尝试使用execv ()实现execvp ()。我不知道代码是否是最好的实现。
我的代码:
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
extern char **environ;
int my_execvp(char *file, char *argv[])
{
char *p, *colon, *pathseq = getenv("PATH");
size_t len;
if(strchr (file, '/'))
return execv(file, argv);
if (pathseq == NULL) {
len = confstr(_CS_PATH, (char *) NULL, 0);
pathseq = (char *) alloca(1 + len);
pathseq[0] = ':';
(void) confstr (_CS_PATH, pathseq + 1, len);
}
len = strlen(file) + strlen(pathseq) + 2;
for(p = pathseq; p && *p; p = colon)
{
char b[len];
colon = strchr(p, ':');
if(colon)
{
memcpy(b, p, (size_t) (colon - p));
b[colon++-p] = 0;
}
else
strcpy(b, p);
strcat (b, "/");
strcat (b, file);
if(!access(b, F_OK)) {
execv(b, argv);
fprintf(stderr, "an error occurred in execv\n");
abort();
}
}
errno = ENOENT;
return -1;
}
int main()
{
/* "ls / -l" */
char *arg[] = {"ls", "/", "-l", NULL};
my_execvp (arg[0], arg);
return 0;
} 我的问题是,这是一个很好的实施吗?如何改进或编写更好的实现?
发布于 2021-03-16 15:54:38
实现是不一致的.
PATH。引用man execp:搜索路径是由路径‘变量在环境中指定的路径。如果未指定此变量,则根据
_PATH_DEFPATH在中的定义设置默认路径。
一旦confstr返回0,检查errno,并采取相应的行动。
abort失败时调用execv是完全错误的。至少返回execv返回的内容。access也是不正确的。如果文件存在,但没有正确的权限,execvp将继续搜索。顺便提一句,access很少有用。考虑盲目调用execvp,并在返回时测试errno。
errno = ENOENT;也是不兼容的。如果文件不存在于任何路径中,execvp将设置ENOENT。如果至少找到了一次,但未能执行,则errno应为EACCES。execvp不应该fprintf任何东西。https://codereview.stackexchange.com/questions/257222
复制相似问题