Функция pipe
возвращает пару файловых дескрипторов int
, а не FILE
. Это означает, что вы можете использовать read
, write
или close
на них, но ни fgetc
, ни feof
.
Кроме того, while(!feof(file))
(почти) всегда неверно , поскольку флаг установлен после неудачного чтения до конца файла.
И это еще не все. Вы получаете EOF только на конце чтения канала, когда все дескрипторы на конце записи закрыты. Поэтому вы должны закрыть или очистить stdout
, чтобы убедиться, что все символы были записаны в канал, закройте дескриптор файла 1, если вы не закрыли стандартный вывод, и закройте tube[1]
, который по-прежнему является файловым дескриптором для конца записи труба.
Таким образом, вы можете заменить цикл while на:
close(tube[1]);
fclose(stdout);
while (1) {
char temp;
if (read(tube[0], &temp, 1) < 1) break;
fprintf(stderr, "chaine : %c\n", temp);
}
Он исправляет SEGFAULT, вызванный использованием feof
и fgetc
для чего-то, что не является FILE
, и обеспечивает правильное закрытие конца записи файла перед чтением его содержимого, чтобы получить хороший конец файла состояние.