无法在 macOS 上的 C execve() 调用中使用 "/usr/bin/env"



我找了一段时间都找不到任何相关的结果,所以我自己也在问这个问题。我有下面的C代码,它试图通过/usr/bin/env执行nasmexecve(),这样我就不必硬编码可执行文件的路径。

#include <unistd.h>
int main(int argc, char**argv) {
char *cmds[10] = {"/usr/bin/env", "nasm", "--version", NULL};
execve(cmds[0], cmds, NULL);
}

在linux(Ubuntu 18/20(上,它运行良好:

linux $ gcc test.c && ./a.out
NASM version 2.13.02
linux $

然而,在macOS(至少Catalina(上,我得到了以下内容:

macos $ gcc test.c && ./a.out                                                                                                                            
env: nasm: No such file or directory
macos $

我不确定有什么区别。我确实安装了NASM,我可以在我的终端上运行nasm --version。如果我将路径/usr/local/bin/nasm硬编码到execve()调用,它也可以正常工作。如果我尝试在我的终端上手动运行以下程序,它似乎也能工作:

macos $ /usr/bin/env nasm --version
NASM version 2.15.05 compiled on Aug 29 2020
macos $

我想要使用/usr/bin/env的原因是nasm的默认安装位置对于不同的操作系统是不同的,并且我不想只是硬编码路径。

问题是您使用了execve

e后缀表示将环境传递给exec系统调用,但传递的环境是NULL。这意味着根本没有环境

请改用execv来使用与调用程序相同的环境。

最新更新