Как предположил sarnold, вам нужно изменить порядок своих звонков.Читайте сначала, подождите в последнюю очередь.Даже если ваш метод сработал, вы можете пропустить последнее чтение.то есть вы выходите из цикла до того, как прочитаете последний набор байтов, который был записан.
Проблема может заключаться в том, что ifstream не блокирует.Мне никогда не нравились iostreams, даже в моих проектах на C ++, мне всегда нравилась простота функций stdio C (т.е. FILE *, fprintf и т. Д.)Один из способов обойти это - читать, если дескриптор читабелен.Вы можете использовать select, чтобы определить, есть ли данные, ожидающие в этом канале.Вам понадобится выбрать, если вы все равно собираетесь читать от нескольких детей, так что, возможно, выучите это сейчас.
Что касается быстрой читаемой функции, попробуйте что-то вроде этого (обратите внимание, у меня нетпопытался скомпилировать это):
bool isreadable(int fd, int timeoutSecs)
{
struct timeval tv = { timeoutSecs, 0 };
fd_set readSet;
FD_ZERO(&readSet);
return select(fds, &readSet, NULL, NULL, &tv) == 1;
}
Затем в родительском коде сделайте что-то вроде:
while (true) {
if (isreadable(fd[READ], 1)) {
// read fd[READ];
if (bytes <= 0)
break;
}
}
wait(pid);