execve - 没有这样的文件或目录?

时间:2012-04-15 01:09:43

标签: c linux execve

我遇到了一些execve的问题。我正在尝试创建一个可以像bash shell一样运行的shell,但是我遇到了forked子执行命令的问题。这就是我对孩子的看法。 cmd是一个char *,其中包含用户输入的命令。但是,当我运行此程序时,我从perror中收到此错误:

execve error: No such file or directory.

我用简单的ls尝试过程序,它应该使path =“/ bin / ls”并执行它(我已经确认这是我的ls命令所在的位置)但它仍然抱怨。我究竟做错了什么?谢谢!

CODE:

if(pid == 0){

     // Parse the command
     char * word = strtok(cmd, " ");
     char path[128] = "/bin/";
     strcat(path, word);

     // Execute the process
     char * newenvp[] = { NULL };
     char * newargv[] = { path, NULL };
     ret = execve(path, newargv, newenvp);
     if(ret == -1){
        perror("execve error");
     }

     return EXIT_SUCCESS;

}

2 个答案:

答案 0 :(得分:4)

首先我要做的就是插入:

printf ("[%s]\n", path);
在致电execve之前

。这应该确认可执行文件是你认为的。

你的代码看起来没问题只要你输入的输入是正确的,并且可执行文件 可用。例如,以下完整程序在我的Debian框中正常工作:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
    if (argc > 1) {
        char * word = strtok (argv[1], " ");
        char path[128] = "/bin/";
        strcat (path, word);

        char * newenvp[] = { NULL };
        char * newargv[] = { path, NULL };
        printf ("[%s]\n", path);
        int ret = execve (path, newargv, newenvp);
        if (ret == -1) {
            perror("execve error");
        }
    }
    return 0;
}

当我运行./testprog ls时输出以下内容:

[/bin/ls]
kidsshares.ods  paxwords    birthdays    homeloantracking.gnumeric
shares2011.ods  backup0.sh  development  lexar
accounts.ods    backup1.sh  photos       testprog.c
testprog

答案 1 :(得分:0)

如果您不想手动浏览文件系统以找到正确的二进制文件,则会execlp(附加 p )。 从联机帮助页:

  

execlp (), execvp ()和 execvpe ()函数在搜索可执行文件时复制shell的操作如果指定   filename不包含斜杠(/)字符。在 PATH 环境变量中指定的以冒号分隔的目录路径名列表中查找该文件。如果未定义此变量,则路径列表默认为当前目录,后跟confstr(_CS_PATH)返回的目录列表。 (此confstr(3)调用通常返回值“/ bin:/ usr / bin”。)[...]