我在执行时遇到一些问题。我正在尝试制作一个可以像 bash shell 一样运行的 shell,但是我在分叉的子进程执行命令时遇到问题。这是我为孩子准备的。cmd 是一个 char * ,其中包含用户输入的命令。但是,当我运行此程序时,我从 perror 中收到此错误:
execve error: No such file or directory.
我已经用一个简单的 ls 尝试过该程序,它应该使 path="/bin/ls" 并执行它(我已经确认这是我的 ls 命令所在的位置),但它仍然抱怨。我究竟做错了什么?谢谢!
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;
}
我要做的第一件事是插入:
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