2017-02-16 4 views
1

У меня есть код языка 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, и приостанавливал родительский процесс до тех пор, пока ребенок не отправит сигнал, но по мере того, как сигналы не поставлены в очередь, концепция сигналов в этом случае терпит неудачу для нескольких дочерних каналов.

+0

Вся идея труб заключается в том, что один процесс только читает его, а другой только пишет. –

+0

Вы не должны пытаться использовать один канал для двунаправленной связи. Синхронизация является лишь одной из проблем (другая заключается в том, что ни одна из сторон не может обнаружить EOF, когда у нее есть конец записи в трубе, даже если другой процесс умер). Используйте две трубы. –

+0

Итак, нужно ли создавать две трубы для каждой пары родитель-ребенок для чтения и записи через трубы? –

ответ

0

Согласно комментариям @JonathanLeffler и @EugeneSh. одиночная труба не подходит для двунаправленной связи. Таким образом, приведенный выше код может быть изменен, чтобы использовать одну трубу для родитель-ребенок и один канал для детей родительском связи следующим образом:

int main(){ 
    int cpid, var; 
    int p2c[2], c2p[2]; 

    pipe(p2c); 
    pipe(c2p); 

    if((cpid=fork())==0){ 
     read(p2c[0], &var, sizeof(int)); 
     printf("Recieved in child - %d\n",var); 

     var = 3; 
     write(c2p[1], &var, sizeof(int)); 
     printf("Writing from child - %d\n",var); 

     exit(0); 
    } 

    var = 5; 
    write(p2c[1], &var, sizeof(int)); 
    printf("Writing from parent - %d\n",var); 

    read(c2p[0], &var, sizeof(int)); 
    printf("Recieved in parent - %d\n",var); 

    waitpid(cpid,NULL,0); 
    return 0; 
} 

Это относится к нескольким детско-родительских логики также.

Смежные вопросы