无法在 macOS 上的 C execve() 调用中使用“/usr/bin/env”
Can't use "/usr/bin/env" in C execve() call on macOS
找了半天也没找到相关的结果,所以自己问。我有以下 C 代码,它试图通过 /usr/bin/env
执行 nasm
到 execve()
,所以我不必硬编码可执行文件的路径。
#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
以使用与调用程序相同的环境。
找了半天也没找到相关的结果,所以自己问。我有以下 C 代码,它试图通过 /usr/bin/env
执行 nasm
到 execve()
,所以我不必硬编码可执行文件的路径。
#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
以使用与调用程序相同的环境。