我有以下代码,其中我使用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: %s\n", username);
printf("program: %s\n", 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: %s\n", username);
printf("program: %s\n", 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)
我该如何解决?
最佳答案
如您在man page for execvpe
中所读:
execvpe()函数是GNU扩展
它不是POSIX功能,macOS不一定支持它,也不是可移植的。
如果运行man execvpe
,将收到以下消息:
无需手动输入execvpe
这表明macOS(至少在我的计算机上)不支持此扩展。
您可以使用本机使用的libc的替代libc来获得它,但是最好仅使用(便携式)POSIX函数之一。
祝好运!
附言
仅供参考:macOS支持以下任何一项:execl
,execle
,execlp
,execv
,execvp
,execvP
关于c - 为什么unistd.h execvpe在macOS上不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59922661/