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
如何使用exec()从另一个c程序运行c程序_C_Process_Exec - Fatal编程技术网

如何使用exec()从另一个c程序运行c程序

如何使用exec()从另一个c程序运行c程序,c,process,exec,C,Process,Exec,我一直试图使用execvp运行一个c程序,但它似乎总是失败 来自main.c int main() { char* args[] = {"2", "1"}; if(execvp("trial.c", args) == -1) { printf("\nfailed connection\n"); } 来自审判 int main(int argc, char** argv){ printf("working"); return 1; } 我想我尽了一切可能在exe

我一直试图使用execvp运行一个c程序,但它似乎总是失败

来自main.c

int main() {
char* args[] = {"2", "1"};
    if(execvp("trial.c", args) == -1) {
        printf("\nfailed connection\n");
    }
来自审判

int main(int argc, char** argv){
printf("working");
return 1;
}
我想我尽了一切可能在exec()中表示该文件位置的方法,但它总是导致“连接失败”。

如果试图调用源文件,则此函数不会这样做。第一个参数应该是可执行文件的路径。如果您想运行的程序是trial.c的源代码,您应该先编译它。例如:

$ gcc -o trial trial.c 
然后对新创建的可执行文件而不是源文件调用
execvp()

if(execvp("trial", args) == -1) { //...

trial.c不是有效的可执行文件。C不是脚本语言或解释语言;不能直接运行C源文件。C程序必须编译并链接到可执行文件。

执行VP的第一个参数需要可执行文件的名称。您传递给它的是源文件的名称。您需要首先编译trial.c,然后将编译后的可执行文件的名称传递给
execvp

if(execvp("---path to executable---/ExecTrial", args) == -1) {
    printf("\nfailed connection\n");
}
关于
execvp
的第二个参数,数组中的最后一个元素必须
NULL
。这就是为什么它知道它到达了列表的末尾。此外,按照惯例,程序的第一个参数是程序本身的名称

因此,首先编译试用版。c:

gcc -g -Wall -Wextra -o trial trial.c
然后修改如何在main中调用它。c:

int main() {
    char* args[] = { "trial", "2", "1", NULL };
    if(execvp("trial", args) == -1) {
        printf("\nfailed connection\n");
    return 1;
}

execvp
的第一个参数是可执行文件的路径。 您需要为
trial.c
构建可执行文件,并将可执行文件的路径传递到
execvp

if(execvp("---path to executable---/ExecTrial", args) == -1) {
    printf("\nfailed connection\n");
}
如果未传递可执行文件路径,
execvp
将在中指定的以冒号分隔的目录路径名列表中搜索可执行文件
PATH
environment variable.

看起来您正在尝试执行的东西不是(尚未)可执行的?您是否尝试过从命令行执行'trial.c'以查看它是否可能工作?您如何编译这两个c源文件,.c文件?具体执行哪些操作会导致“连接失败”?“
if(execvp(…)
“无需使用
if()
,因为
exec*()
函数系列的成员只会在出错时返回。嘿,感谢您的响应!我做了你提到的更改,但我仍然得到“连接失败”。trail.c文件中有什么需要更改的吗?我当前的main.c是:
char*args[]={“player”,NULL}
if(execvp(“player”,args)=-1){printf(“\n连接失败\n”)}
@josephcornell使用
peror
而不是
printf
打印错误消息。这将告诉你它失败的原因。