如何使用execv运行另一个C程序

时间:2016-01-30 22:27:03

标签: c process parallel-processing

我想使用execv作为子进程运行单独的C程序。下面的代码没有产生我需要的结果(write.c没有得到编译和执行)。不确定是什么问题。

int buffered_child;
int native_child = fork();
if(native_child == 0){
  printf("\nnative child\n");
  execv("gcc -o /abc/write.o /abc/write.c; /abc/./write.o",argv);
  exit(1);
}

3 个答案:

答案 0 :(得分:0)

execv不执行PATH插值,因此,在您的情况下,gcc需要与您正在执行的程序位于同一目录中。尝试使用execvp(将使用您当前的PATH)查找您尝试运行的可执行文件,或在gcc来电中指定execv的完整路径。

http://www.gnu.org/software/libc/manual/html_node/Executing-a-File.html

答案 1 :(得分:0)

https://git-scm.com/docs/gitignore系统调用需要第一个参数中可执行文件的路径名,以及第二个参数中该函数的参数列表。它不会在execvp()上搜索命令;为此,您需要char *argv[] = { "gcc", "-c", "-o", "/abc/write.o", "/abc/write.c", 0 }; execvp(argv[0], argv);

要实现您的目标,您需要的代码更像:

.o

在仔细审查原始命令行后,您将创建一个带有后缀char *argv[] = { "sh", "-c", "gcc -o /abc/write.o /abc/write.c; /abc/./write.o", 0 }; execvp(argv[0], argv); 的可执行文件,然后运行它。 (这是一个奇怪的后缀选择;最令人困惑的 - 强烈不推荐。)为此,你需要调用一个shell:

.

执行路径中的fork()也是不必要的。或者,更简单(无需明确system("gcc -o /abc/write.o /abc/write.c; /abc/write.o"); ):

fork()

或者您需要安排孩子分叉和孙子来运行编译器,然后孩子可以在孙子完成时运行程序;这可以使用exec*和上述.socialcontainer{ float:right; } .social1{ float:left; margin-bottom: 2em; } .social2{ float:right; margin-bottom: 2em; } // DELETED SOME LINES ....函数之一来完成。

答案 2 :(得分:0)

您需要构造要发送的argv数组,并使用完整路径作为第一个参数。例如:

char *gcc_argv[] = {"gcc",
                    "-o",
                    "/abc/write.o",
                    "-c",
                    "/abc/write.c",
                    NULL};

execv("/usr/bin/gcc", gcc_argv);

请注意,gcc中的gcc_argv条目是传递给gcc argv的第一个元素。然而,execv的第一个参数是用来调用它的路径。