Проблема в том, что файловые дескрипторы не инициализируются функцией pipe. Когда функция чтения достигнута, fd[0]
, вероятно, является неверным дескриптором файла. 0 байтов читаются, целые числа, которые записываются в стандартный вывод - это то, что было в неинициализированном массиве parentData
.
Просто добавьте:
pipe(fd);
Как работает синхронизация?
Когда функция read
вызывается с допустимым файловым дескриптором, ядро останавливает / блокирует процесс и ожидает, пока другой процесс не записывает запрошенное количество байтов (sizeof parentData
) в канал. Затем ядро копирует байты из канала. Это называется блокировкой ввода-вывода.
Примечание: когда процесс записи останавливает / закрывает файловый дескриптор до достижения запрошенного количества байтов, не все байты записываются в буфер. Возвращаемое значение read
- это количество прочитанных байтов.
Существует также неблокирующий ввод-вывод. Процесс может делать другие вещи в ожидании данных. Это часто реализуется с помощью потока, который читает (с блокировкой ввода-вывода) из файлового дескриптора / сокета (сетевой ввод-вывод) и устанавливает флаг по окончании.