关闭管道会导致从文件中读取错误的行(这与管道无关)

时间:2011-05-11 02:03:48

标签: c unix pipe

我正在编写一个包含许多子进程的程序。父级有两个管道写入子级,每个管道都被复制到子级中的单独文件描述符中。父级通过一个包含许多命令的脚本文件来读取它需要做的事情。这似乎工作得很好,除了我注意到,如果我尝试关闭从父到子的管道然后如果脚本文件中的下一行是完全空白,它将被奇怪地读取。如果我将其打印出来,那么它就会显示为���<我的程序(可以理解)不知道该怎么做。

我正在读取的文件指针与正在关闭的管道之间似乎没有链接。

我在线下阅读的代码如下。它通常工作正常,只是在这种情况下,它无法正常工作,我无法解决原因。

char *get_script_line(FILE *script)
{
    char *line;
    char charRead;
    int placeInStr = 0;
    int currentSizeOfStr = 80;
    int maxStrLength = 64;

    /* initialize the line */
    line = (char *)malloc(sizeof(char)*currentSizeOfStr);

    while ((charRead = fgetc(script)) != EOF && charRead != '\n') {
        /* read each char from input and put it in the array */ 
        line[placeInStr] = charRead;
        placeInStr++;
        if (placeInStr == currentSizeOfStr) {
            /* array will run out of room, need to allocate */ 
            /* some more space */ 
            currentSizeOfStr = placeInStr + maxStrLength;
            line = realloc(line, currentSizeOfStr);
            }
    }

    if (charRead == EOF && placeInStr == 0)
    {
        /* EOF, return null */
        return NULL;
    }

    return line;
}

当我关闭管道时,我正在这样做:

fflush(pipe);
fclose(pipe);

有没有人知道我可能做错了什么?或者对如何调试此问题有一些想法?

编辑:要清楚我的输入脚本可能(基本上)看起来像这样:

Start a new child and set up pipes etc
Send EOF to one of the pipes to the child
(BLANK LINE)
Do something else

否则它工作正常,我很确定我正在关闭管道,因为我正在做的将发送EOF。

2 个答案:

答案 0 :(得分:1)

我建议在valgrind下运行你的程序来检查内存错误。

答案 1 :(得分:0)

实际上......我想我刚修好了。当我完成它时,我没有释放get_script_line中的行,但是一旦我把它放入其中就已经开始正常工作了。我不知道为什么那会产生影响..如果有人能告诉我为什么不释放记忆会产生这种影响会有兴趣吗?