execvp - ls:fts_open:没有这样的文件或目录

时间:2013-04-09 03:20:57

标签: c exec fork execvp

我正在努力解决这个错误。我正在编写一个shell模拟器,使用fork()来执行使用execvp();的命令。 几乎我尝试解析到我的shell的每个命令都工作得很好,除了没有参数的ls。 如果我尝试执行ls -lah,一切正常,但是一个简单的ls不会,收到以下错误:

ls: fts_open: No such file or directory

以下是我的代码片段:(只是必不可少的)

pid = fork();
      if (pid==0)
      {
        puts("CHILD");
        puts(args[0]);
        puts(args[1]);
        printf("%d\n", strlen(args[1]));
        args[2] = NULL;
        execvp(args[0], args);
      }
      else wait(NULL);
      puts("BACK TO PARENT");
    }

,这是ls的输出:

ls
CHILD
ls

0
ls: fts_open: No such file or directory
BACK TO PARENT

如你所见,args [0]包含ls,args [1]为空,因为没有参数,args [1]的长度为0,但我不断收到错误。

关于它可能是什么的任何想法?

编辑:

感谢Jonathan Leffler发现它:(而且,这似乎只是Mac上的一个问题)

关键是args [1]实际上并不是空的,因此,操作系统会尝试打开''文件,显然,该文件不存在,并且看起来不能创建,因为它实际上并不是一个名字。

所以,这就是我所做的:检查args [1]的len。如果为0,则将其设置为NULL。 (只是释放记忆并没有真正帮助)

pid = fork();
      if (pid==0)
      {
        puts("CHILD");
        puts(args[0]);
        puts(args[1]);
        if (strlen(args[1]) == 0)
            args[1] = 0;
        args[2] = NULL;
        execvp(args[0], args);
      }
      else wait(NULL);
      puts("BACK TO PARENT");
    }

1 个答案:

答案 0 :(得分:5)

如果没有更多参数,则指针应该为null,而不是指向零长度字符串的非空指针。

pid = fork();
if (pid==0)
{
    puts("CHILD");
    puts(args[0]);
    fflush(stdout);
    args[1] = 0;
    execvp(args[0], args);
    fprintf(stderr, "Failed to exec %s\n", args[0]);
    exit(1);
}
else
    wait(NULL);
puts("BACK TO PARENT");

出于纯粹的好奇心,我在命令行尝试了这个:

$ ls ''
ls: fts_open: No such file or directory
$

您是否也在Mac上运行? (说我很惊讶地看到同样的消息并未开始描述我的反应!)更有趣的是创建文件fts_open似乎没有消除错误消息。 ls的奇怪行为,但是响应无效请求(没有文件名是空字符串)。