Закрытие канала приводит к считыванию неправильной строки из файла (который не зависит от канала)

#c #unix #pipe

#c #unix #канал

Вопрос:

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

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

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

 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 amp;amp; 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 amp;amp; 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, как и предполагалось.

Ответ №1:

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

Комментарии:

1. Спасибо, я просто просмотрел его и запустил, и я получаю кучу ошибок о недопустимом чтении / записи размера n.. Я предполагаю, что это плохо? Как мне интерпретировать то, что происходит? И что еще более важно, как мне это исправить?

Ответ №2:

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