我想使用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);
}
答案 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
的第一个参数是用来调用它的路径。