#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, когда я закончил с этим, но как только я вставил это, все начало работать правильно. Я понятия не имею, почему это могло бы иметь эффект.. было бы интересно, если бы кто-нибудь мог сказать мне, почему не освобождение памяти может иметь такой эффект?