首页 文章

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

提问于
浏览
1

我在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 回答

  • 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
    
  • 0

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

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

相关问题