首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更好地实现` `execvp`‘调用:代码实现` `execvp`’

更好地实现` `execvp`‘调用:代码实现` `execvp`’
EN

Code Review用户
提问于 2021-03-16 09:26:07
回答 1查看 99关注 0票数 1

我正在尝试使用execv ()实现execvp ()。我不知道代码是否是最好的实现。

我的代码:

代码语言:javascript
复制
#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;
} 

我的问题是,这是一个很好的实施吗?如何改进或编写更好的实现?

EN

回答 1

Code Review用户

发布于 2021-03-16 15:54:38

实现是不一致的.

  1. 不处理未定义的PATH。引用man execp

搜索路径是由路径‘变量在环境中指定的路径。如果未指定此变量,则根据_PATH_DEFPATH在中的定义设置默认路径。

一旦confstr返回0,检查errno,并采取相应的行动。

  1. abort失败时调用execv是完全错误的。至少返回execv返回的内容。
  2. 调用access也是不正确的。如果文件存在,但没有正确的权限,execvp将继续搜索。

顺便提一句,access很少有用。考虑盲目调用execvp,并在返回时测试errno

  1. 最终的errno = ENOENT;也是不兼容的。如果文件不存在于任何路径中,execvp将设置ENOENT。如果至少找到了一次,但未能执行,则errno应为EACCES
  2. execvp不应该fprintf任何东西。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/257222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档