c语言 - 为什么unistd.h execvpe在macOS上不起作用?



我有以下代码,其中我正在使用unistd.h的execve在C程序中执行另一个程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv) {
//  char *env_init[] = {"USER=unknown", "PATH=/tmp", NULL};
char* username = argv[1];
char* program = argv[2];
printf("username: %sn", username);
printf("program: %sn", program);

if (execvp(program, argv + 2) < 0)
printf("error");
return 0;
}

它运行良好。但是当我尝试将环境放入程序中并使用execvpe运行程序时,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv) {
char *env_init[] = {"USER=unknown", "PATH=/tmp", NULL};
char* username = argv[1];
char* program = argv[2];
printf("username: %sn", username);
printf("program: %sn", program);

if (execvpe(program, argv + 2, env_init) < 0)
printf("error");
return 0;
}

我收到以下错误:

runas.c:18:7: error: implicit declaration of function 'execvpe' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
if (execvpe(program, argv + 3, env_init) < 0)

我该如何解决这个问题?

正如您可以在手册页中读到的execvpe

execvpe(( 函数是一个 GNU 扩展

它不是POSIX功能,macOS不一定支持它,也不是便携式的。

如果您运行man execvpe您将收到以下消息:

没有手动输入执行

这表明 macOS(至少在我的机器上(不支持此扩展。

您可以通过使用本机使用的替代libc来获得它,但最好简单地使用其中一个(可移植的(POSIX函数。

祝你好运!

附言

仅供参考:macOS 支持以下任何一项:execlexecleexeclpexecvexecvpexecvP

最新更新