Я изучаю межпроцессное общение и натолкнулся на приведенную ниже примерную программу.Вилка и трубы: эта программа C содержит условие гонки?
Я не понимаю, что это предотвратить родительский процесс с попыткой выполнения чтения (как часть условия еще в нижней части программы) до дочернего процесса завершил запись.
Что (если что-либо) ограничивает родительский процесс от попытки чтения со стандартного ввода до того, как дочерний процесс записал на стандартный вывод?
int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];
pipe(fd);
if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if(childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
/* Send "string" through the output side of pipe */
write(fd[1], string, (strlen(string)+1));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}
return(0);
}
при вызове системной функции 'pipe()', всегда проверяйте возвращаемое значение, чтобы убедиться, что операция прошла успешно. on success, pipe() возвращает 0 при неудаче, pipe() возвращает -1 и устанавливает «errno» – user3629249
комментарии о закрытии концов конвейера обращаются назад – user3629249
Функция 'read()' не добавляет байта окончания строки ' \ 0 'в строку чтения, поэтому немедленный вызов printf() (вероятно) завершится с ошибкой. В зависимости от того, что происходит первым, read() или write(), чтение может вернуться, не прочитав все байты данных. Чтение должно быть в цикле, проверяя/накапливая возвращаемые байты. Когда возвращаемый счетчик байтов равен 0, завершите строку, используя накопленные байтовые подсчеты (возможно, не обязательно, поскольку дочерний элемент отправляет байт завершения, но это хорошая практика). Если возвращаемое значение когда-либо <0 обрабатывает ошибку – user3629249