2015-06-21 2 views
2

Я пытаюсь сделать что-то здесь, у меня есть программа c, где мой родительский процесс создает канал, чтобы он мог прослушивать запрос от дочернего процесса. Эти дети создаются динамически, это никогда не совпадает с числом. До сих пор мне удалось отправить запросы родителям через канал и синхронизировать их с мьютексом.C программирование двунаправленная связь

Моя проблема заключается в том, что для этого запроса был предоставлен ответ ребенку, который сделал такой запрос, и я не могу использовать один и тот же канал с одного его пути, и все остальные дети будут его использовать (я уже пробовал и он генерирует serius issue)

Следующее, что я пробовал, - это сделать трубку перед запросом на дочернем элементе и передать значение дескриптора в запросе. Также не удалось, так как родитель не знает эти дескрипторы, которые я узнал после неудачи.

Итак, теперь я не знаю, как заставить ответ этого запроса достичь ребенка ... Я начинаю с программированием на С, поэтому вся помощь приветствуется!

КСТАТИ: работа в программе Unix, чистый C программирования

+0

Вы пробовали передать дескриптор трубы в родительский процесс по конвейеру, на который ребенок прослушивает ответ? – phyrrus9

+0

Также можно увидеть код – phyrrus9

+0

Вы можете дать каждому дочернему процессу канал для ввода и канал для вывода, а родительский процесс будет использовать другие концы. Если вы можете использовать 'stdin' и' stdout' для труб, тем лучше. Розетки - еще одна альтернатива. http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html - хороший источник информации. Так книги Ричарда Стивенса по программированию UNIX. – PSkocik

ответ

5

Трубы однонаправленный и с помощью сокетов кажется болезненным для маленькой Ipc вещи.

Я рекомендую вам использовать socketpair(). Вы можете рассматривать их как двунаправленные трубы.

Вот пример, когда родитель отправляет характер его child.Then ребенку делает его прописным и отправляет его обратно к родителю. (Это из учебника beej «s)

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 

int main(void) 
{ 
    int sv[2]; /* the pair of socket descriptors */ 
    char buf; /* for data exchange between processes */ 

    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) { 
     perror("socketpair"); 
     exit(1); 
    } 

    if (!fork()) { /* child */ 
     read(sv[1], &buf, 1); 
     printf("child: read '%c'\n", buf); 
     buf = toupper(buf); /* make it uppercase */ 
     write(sv[1], &buf, 1); 
     printf("child: sent '%c'\n", buf); 

    } else { /* parent */ 
     write(sv[0], "b", 1); 
     printf("parent: sent 'b'\n"); 
     read(sv[0], &buf, 1); 
     printf("parent: read '%c'\n", buf); 
     wait(NULL); /* wait for child to die */ 
    } 

    return 0; 
} 

Также вы можете легко используйте две трубы для двух направлений.

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