Как правильно использовать execvpe () в C? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь запустить скомпилированный код C с помощью функции execvpe() в C. Мой файл кода находится в /code/Solution.c.Я скомпилировал его с помощью команды gcc /code/Solution.c -o /code/Solution.Я хочу запустить скомпилированный код, т. Е. Файл /code/Solution, используя execvpe().Когда я запускаю его вручную, я использую команду ./code/Solution < /input/1.txt &> /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;
}

1 Ответ

0 голосов
/ 14 ноября 2018

Операторы перенаправления не являются аргументами, которые передаются ядру. Это особенность языка оболочки.

< /input/1.txt или более явно 0</input/1.txt означает приблизительно (сообщить об ошибках в соответствии с вашими предпочтениями):

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);

, в то время как &>/stdout/1.txt или более POSIXly / явно 1> /stdout/1.txt 2>&1 означает

// 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"); /*...*/ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...