Закрытие канала приводит к тому, что из файла читается неправильная строка (это не зависит от канала) - PullRequest
0 голосов
/ 11 мая 2011

Я пишу программу, которая имеет несколько дочерних процессов. Родитель имеет два канала для записи дочернему элементу, каждый канал дублируется в отдельный дескриптор файла в дочернем элементе. Родитель читает файл сценария с несколькими командами, чтобы выполнить то, что ему нужно сделать. Кажется, это работает нормально, за исключением того, что я заметил, что если я попытаюсь закрыть канал от родителя к потомку, то, если следующая строка в файле скрипта будет полностью пустой, она будет читать странным образом. Если я распечатываю его, то получается ���<, с которым моя программа (понятно) не знает, что делать.

Кажется, что нет никакой связи между указателем файла, с которого я читаю, и каналом, который я закрываю.

Мой код для чтения в строках ниже. Он работает совершенно нормально, просто в этом случае он не работает должным образом, и я не могу понять, почему.

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

Кто-нибудь имеет представление о том, что я могу делать неправильно? Или есть какое-то представление о том, как отладить эту проблему?

edit: Для ясности мой входной скрипт может (в основном) выглядеть примерно так:

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 ]

1 голос
/ 11 мая 2011

Я предлагаю запустить вашу программу под valgrind для проверки ошибок памяти.

0 голосов
/ 11 мая 2011

На самом деле .. думаю, я просто исправил это.Я не освобождаю строку в get_script_line, когда закончу с ней, но как только я вставил это, все начало работать правильно.Я понятия не имею, почему это будет иметь эффект, хотя ... было бы интересно, если бы кто-нибудь мог сказать мне, почему освобождение памяти не может иметь такой эффект?

...