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