У меня есть код языка C, реализующий трубы для связи родителя и ребенка. Мне постоянно нужно читать и писать как из родителя, так и из ребенка. Уменьшенная версия кода выглядит следующим образом:Когда родитель записывает данные в канал, совместно используемый с раздвоенным дочерним элементом, и оба читают данные, как запретить родителям читать его перед ребенком?
int main(){
int cpid, var;
int fds[2];
pipe(fds);
if((cpid=fork())==0){
read(fds[0], &var, sizeof(int));
printf("Recieved in child - %d\n",var);
var = 3;
write(fds[1], &var, sizeof(int));
printf("Writing from child - %d\n",var);
exit(0);
}
var = 5;
write(fds[1], &var, sizeof(int));
printf("Writing from parent - %d\n",var);
// I need something here to execute following read only after child writes
read(fds[0], &var, sizeof(int));
printf("Recieved in parent - %d\n",var);
waitpid(cpid,NULL,0);
return 0;
}
Но я перед проблемой, что чтение в родительском процессе становится выполняться только после записи от родителей. Мне нужно предотвратить это. Есть ли способ остановить чтение в родительском до тех пор, пока ребенок не напишет выше код? Любые алгоритмы или предложения приветствуются.
PS: Я пытался использовать сигналы, подобные SUGUSR1, и приостанавливал родительский процесс до тех пор, пока ребенок не отправит сигнал, но по мере того, как сигналы не поставлены в очередь, концепция сигналов в этом случае терпит неудачу для нескольких дочерних каналов.
Вся идея труб заключается в том, что один процесс только читает его, а другой только пишет. –
Вы не должны пытаться использовать один канал для двунаправленной связи. Синхронизация является лишь одной из проблем (другая заключается в том, что ни одна из сторон не может обнаружить EOF, когда у нее есть конец записи в трубе, даже если другой процесс умер). Используйте две трубы. –
Итак, нужно ли создавать две трубы для каждой пары родитель-ребенок для чтения и записи через трубы? –