Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
如何使用execv运行另一个C程序_C_Process_Parallel Processing - Fatal编程技术网

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

如何使用execv运行另一个C程序,c,process,parallel-processing,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); } exec

我想使用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);
}

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

系统调用需要在第一个参数中输入可执行文件的路径名,在第二个参数中输入该函数的参数列表。它不会在
$PATH
上搜索命令;为此,您需要使用
execvp()

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

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

char *argv[] = { "sh", "-c", "gcc -o /abc/write.o /abc/write.c; /abc/./write.o", 0 };
execvp(argv[0], argv);
执行路径中的
也是不必要的。或者,更简单地说(无需显式地
fork()
):


或者,您需要安排子代分叉,孙子代运行编译器,然后在孙子代完成时,子代可以运行程序;这可以使用
fork()
和上面的一个
exec*
函数来完成。

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

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

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

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

原始命令首先运行编译器以创建带有
.o
后缀(不推荐)的可执行文件,然后运行该可执行文件。除非你运行一个shell来处理它,否则你不能同时使用一个命令。@Jonathan是的,我意识到这并不完全是OP所拥有的,但它是用来作为一个如何调用
execv
的例子的。我很同情-如果你注意到我的答案,第一个建议的命令行与你的命令行是同构的(我将
-c
选项放在
-o
和输出文件之前)。还可以解释所有问题以及您所做的任何更改(虽然我略读了一下添加
-c
的位置和原因,但我确实指出,以
.o
结尾和可执行名称是非正统的)。
char *gcc_argv[] = {"gcc",
                    "-o",
                    "/abc/write.o",
                    "-c",
                    "/abc/write.c",
                    NULL};

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