Странное поведение при перенаправлении вывода exec () - PullRequest
2 голосов
/ 23 мая 2019

Я пишу программу, которая создает текстовые файлы input.txt и использует ее в качестве ввода exec().У меня проблемы с перенаправлением вывода в другой файл output.txt, и они, похоже, связаны с записью input.txt.

Если я использую fwrite(array, 4, 1, file), перенаправление работает.Если я использую fwrite(array, sizeof(array), 1, file) или fprint, это не так.

FILE *finput = fopen("input.txt", "w");
for (int i=0; i<dimension; i++)
{
    char c; // I get it from another file, it isnt't important.
    char arr[1];
    arr[0] = c;

    // WORKING LINE OF CODE
    fwrite(arr, 4, 1, finput);

    // NOT-WORKING LINE OF CODE
    // fwrite(arr, sizeof(arr), 1, finput);

    // ANOTHER NOT-WORKING LINE OF CODE
    // fprintf(finput, "%c", c);
}

pid_t pid;
int status = -1;
pid = fork();
if (pid == -1)
{
    printf("ERROR.");
}
else if ( pid == 0)
{
    int fdOutput = creat("output.txt", 0777);
    dup2(fdOutput, 1);
    dup2(fdOutput, 2);
    close(fdOutput);
    // awkScript is an awk program string
    int executionResult = execl("/usr/bin/gawk", "gawk", awkScript, "input.txt", (char*)NULL);
    // ...
}

Если я напишу рабочую строку кода, в конце программы у меня будет какой-то текст в файле output.txt,В противном случае, он полностью пуст.

Самое странное, что input.txt работает в любом случае, оно всегда правильно написано.Поэтому я не могу понять, почему это должно быть связано с его написанием.Если я выполню команду:

gawk $awkScript input.txt

Вывод будет напечатан всеми тремя способами, используемыми для записи input.txt

1 Ответ

3 голосов
/ 23 мая 2019

Есть несколько проблем с этим кодом (например, размер 4 ... откуда он берется? Ваш массив имеет длину 1 байт; так что это неопределенное поведение), но основная причина, почему он терпит неудачу, заключается в том, что вы не можете закрыть свойфайл.Это означает, что выходной буфер никогда не сбрасывается и выход не записывается.

Либо fclose файл, либо, по крайней мере, fflush его после записи.

...