如何使用 execvp——查找文件参数

how to use execvp--finding the file argument

我编写了一个测试程序来尝试理解如何使用 execvp(),但我一直 运行 遇到问题。我的代码的相关部分是:

...
printf("execute: 'ls -a'\n"); 
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";
...
} else if(pid == 0){ //child process
    if(execvp(*args, args) < 0) { //execute command
        fprintf(stderr, "Error: execution failed\n");
        exit(1);
    }
}
...

每当我 运行 时,我都会收到错误消息“/bin/ls:无法访问 ls:没有这样的文件或目录”。 which ls 告诉我 /bin/ls 所以我不明白我做错了什么。是因为可执行文件不在我的主目录中而是在项目文件中吗?

与此处相同的问题C - error when attempting to pass /bin/ls to execvp

您基本上必须用 NULL 指针终止指针数组。

这里有几个问题:

args 被定义为一个 2 元素数组,但您要放入 3 个元素,所以您写的是数组的末尾。

args数组需要有一个NULL指针作为最后一个元素,否则execvp不知道什么时候到达参数列表的末尾。

args 中的第一个元素应该是程序的名称(这是 ps 列表中显示的内容),后续元素应该是参数。现在,您将 ls 作为数组中的第二个元素,这意味着它是命令 /bin/ls 的第一个参数。所以 ls 命令试图在当前目录中找到名为 ls 的文件但找不到。这解释了您收到的错误消息。

应用修复后:

...
printf("execute: 'ls -a'\n"); 
char *args[3];
char *path = "/bin/ls";
args[0] = "ls";
args[1] = "-a";
args[2] = NULL;
...
} else if(pid == 0){ //child process
    if(execvp(path, args) < 0) { //execute command
        fprintf(stderr, "Error: execution failed\n");
        exit(1);
    }
}

我真的认为代码是

char *args[3];
args[0] = "/bin/ls";
args[1] = "-a";
args[2] = NULL;

char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";