Создать трубы после вилки - PullRequest
0 голосов
/ 21 января 2012

Возможно / правильно ли это сделать?Если я сделаю запись из fd1 [1] «дочернего» процесса, то сделаю возможным чтение из fd2 [0] «отца» процесса?

main(){
    pid_t pid;
    pid = fork();
    if(pid <0){
        return -1;
    }
    if(pid == 0){
        int fd1[2];
        int fd2[2];
        pipe(fd1);
        pipe(fd2);
        close fd1[1];
        close fd2[0];
        //writes & reads between the fd1 pipes
        //writes & reads between the fd2 pipes
    }else{
        int fd1[2];
        int fd2[2];
        pipe(fd1);
        pipe(fd2);
        close fd1[1];
        close fd2[0];
        //writes & reads between the fd1 pipes
        //writes & reads between the fd2 pipes
    }
}

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Вам нужно настроить трубу перед разветвлением .

int fds[2];

if (pipe(fds))
    perror("pipe");

switch(fork()) {
case -1:
    perror("fork");
    break;
case 0:
    if (close(fds[0])) /* Close read. */
        perror("close");

    /* What you write(2) to fds[1] will end up in the parent in fds[0]. */

    break;
default:
    if (close(fds[1])) /* Close write. */
        perror("close");

    /* The parent can read from fds[0]. */

    break;
}
4 голосов
/ 21 января 2012

Нет, каналы, используемые для связи между процессами, должны быть созданы до fork() (в противном случае у вас нет простого способа отправки через них, так как чтение и запись должны использоваться разными процессы).

есть грязные трюки для отправки дескриптора файла между процессами в виде внеполосного сообщения на сокете, но я действительно забыл детали, которые ужасны

...