2013-04-09 34 views
2

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

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,但我不断收到错误。

想法是什么?

编辑:

荣誉乔纳森莱弗勒寻找出来:(也,现在看来似乎只是在Mac上的问题)

的一点是ARGS [1]是不是真的空,因此,操作系统会尝试打开''文件,显然,该文件不存在,并且根据外观,无法创建,因为它不是真正的名称。

所以,这是我做的:检查args的len [1]。如果它是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"); 
    } 
+0

可以显示'args'的完整定义(什么'args [1]'设置为,什么是“空”?)以及更多的代码? – 2013-04-09 03:39:50

回答

5

如果没有更多的参数,指针为空,而不是一个非空指针到零长度字符串。

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,但响应无效请求(没有文件名称是空字符串)。

+0

谢谢!我将更新我的问题以显示我的代码是如何变成的,但是,基本上,我检查了args的len [1],如果它是0,则只是将其设置为NULL。 – 2013-04-09 03:49:04

+0

是的,我也在Mac上运行。我做了一些快速的研究,似乎fts_open与操作系统有关。可能涉及档案开放。 – 2013-04-09 03:51:17

+0

'fts_open'是遍历目录层次结构的内部函数。错误信息表示错误发生在函数fts_open中的程序'ls'中,该函数返回了错误代码'ENOENT'。 – melpomene 2015-10-11 11:12:38

相关问题