Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么unistd.h execvpe不能在macOS上工作?_C_Exec - Fatal编程技术网

为什么unistd.h execvpe不能在macOS上工作?

为什么unistd.h execvpe不能在macOS上工作?,c,exec,C,Exec,我有以下代码,其中我正在使用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];

我有以下代码,其中我正在使用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)
如何解决此问题?

如您在以下内容中所读:

execvpe函数是GNU扩展

它不是POSIX函数,macOS也不一定支持它,也不是可移植的

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

execvpe没有手动输入

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

您可以使用本机使用的libc之外的另一个libc来获得它,但最好只使用一个可移植的POSIX函数

祝你好运

附言

仅供参考:macOS支持以下任意一项:execl、execle、execlp、execv、execvp、execvp,您可以在中阅读:

execvpe函数是GNU扩展

它不是POSIX函数,macOS也不一定支持它,也不是可移植的

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

execvpe没有手动输入

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

您可以使用本机使用的libc之外的另一个libc来获得它,但最好只使用一个可移植的POSIX函数

祝你好运

附言

仅供参考:macOS支持以下任何一种:execl、execle、execlp、execv、execvp、execvp

execvpe3是execve2的前端[并非针对所有libc都存在]。所以,直接使用execve。有些[macOS]解决方法是使用-Dexecvpe=execve进行编译,但在我看来,最好直接使用execve。有关使用execvp的execvpe的简单但有效的实现,请参阅。我还有一个更复杂的版本,它使用execve并分析路径设置本身。查看所使用的路径设置是传递给execvpe的环境中的路径设置还是当前环境中的路径设置总是很有意思的。execvpe3是ExecVP2的前端[并非所有libc都存在]。所以,直接使用execve。有些[macOS]解决方法是使用-Dexecvpe=execve进行编译,但在我看来,最好直接使用execve。有关使用execvp的execvpe的简单但有效的实现,请参阅。我还有一个更复杂的版本,它使用execve并分析路径设置本身。查看所使用的路径设置是传递给execvpe的环境中的设置还是当前环境中的设置总是很有趣的。