如何在C中正确使用execvpe()?

如何在C中正确使用execvpe()?,c,process,C,Process,我正在尝试使用C中的execvpe函数运行已编译的C代码。我的代码文件位于/code/Solution.C。我使用gcc/code/Solution.c-o/code/Solution命令编译了它。我想使用execvpe运行编译后的代码,即/code/Solution文件。当我手动运行它时,我使用命令./code/Solution/stdout/1.txt,它工作得很好,但它会出错。当我尝试使用execvpe以编程方式执行相同的操作时,程序永远不会结束。以下是我的代码: #define _GNU

我正在尝试使用C中的execvpe函数运行已编译的C代码。我的代码文件位于/code/Solution.C。我使用gcc/code/Solution.c-o/code/Solution命令编译了它。我想使用execvpe运行编译后的代码,即/code/Solution文件。当我手动运行它时,我使用命令./code/Solution/stdout/1.txt,它工作得很好,但它会出错。当我尝试使用execvpe以编程方式执行相同的操作时,程序永远不会结束。以下是我的代码:

#define _GNU_SOURCE
#include<unistd.h>
#include<stdio.h>

int main(){
    char *args[] = {"./Solution", "<", "/input/1.txt", "&>", "/stdout/1.txt", NULL};
    char *env[]  = {"PATH=/code", NULL};
    int x = execvpe("Solution", args, env);
    printf("%d\n", x);
    return 0;
}

重定向操作符不是传递给内核的参数。 它们是一种shell语言特性

/stdout/1.txt 2>&1表示


重定向操作符不是传递给内核的参数。 它们是一种shell语言特性

/stdout/1.txt 2>&1表示


请将代码作为文本而不是图片发布。Ref../Solution、/stdout/1.txt需要执行命令处理。示例:在shell中执行此操作时./code/Solution/stdout/1.txt从./code/Solution运行程序,不带参数,stdin从/input/1.txt文件绑定,stdout和stderr绑定到/stdout/1.txt。您可以使用fork+dup和exec重新创建它。使用execvpe,您可以使用适当的参数运行/bin/sh{-c,\./code/Solution<..\},或者您需要调用dup来绑定stdout、stderr和stdin,然后调用execvpe。它不是c,而是shell。见第2.7.1节。和2.7.2。还有整个重定向部分。&>是来自C Shell的东西,意味着重定向1和2文件描述符,即与>文件2>&1相同,请将代码作为文本而不是图片发布。Ref../Solution,/stdout/1.txt需要执行命令处理。示例:在shell中执行此操作时./code/Solution/stdout/1.txt从./code/Solution运行程序,不带参数,stdin从/input/1.txt文件绑定,stdout和stderr绑定到/stdout/1.txt。您可以使用fork+dup和exec重新创建它。使用execvpe,您可以使用适当的参数运行/bin/sh{-c,\./code/Solution<..\},或者您需要调用dup来绑定stdout、stderr和stdin,然后调用execvpe。它不是c,而是shell。见第2.7.1节。和2.7.2。还有整个重定向部分。&>是来自C Shell的东西,意味着重定向1和2文件描述符,即与>文件2>&1 hank you@PSkocikThank you@PSkocik相同
int fd;
if(0>(fd=open("/input/1.txt",O_RDONLY))){ perror("open"); /*...*/ }
if(0>dup2(fd,0)){ perror("dup"); /*...*/ }
if(fd!=0) close(fd);
// 1> /stdout/1.txt
if(0>(fd=open("/stdout/1.txt",O_WRONLY|O_TRUNC))){ perror("open"); /*...*/ }
if(0>dup2(fd,1)){ perror("dup"); /*...*/ }
if(fd!=1) close(fd);

// 2>&1
if(0>dup2(1,2)){ perror("dup"); /*...*/ }