重定向exec()输出的奇怪行为

时间:2019-05-23 09:56:58

标签: c exec fwrite dup2

我正在编写一个创建txt文件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 个答案:

答案 0 :(得分:3)

此代码存在多个问题(例如大小4…它来自哪里?您的数组长1个字节;这是未定义的行为),但是失败的根本原因是您无法关闭自己的代码文件。这意味着输出缓冲区永远不会被刷新,也不会写入任何输出。

fclose是文件,或者写入后至少fflush