C编程双向通信

Ari*_*oli 2 c unix ipc multiprocessing inter-process-communicat

我想在这里做一些工作,我有一个程序,我的父进程创建一个管道,所以他可以听取来自子进程的请求.这些子项是动态创建的,它永远不会是相同的数字.到目前为止,我设法通过管道将请求发送给父级,并通过互斥锁进行同步.

我的问题是,这个请求需要一个提供给这个请求的孩子的答案,并且我不能使用相同的管道,因为它的一种方式,所有其他孩子将使用它(我已经尝试过,它会产生一个严重的问题)

我尝试的下一件事是在子请求之前创建一个管道并在请求中传递描述符的值.也失败了,因为父母不知道那些描述符,我在失败后发现了.

所以现在我对如何让请求响应到达孩子感到无能为力......我是C编程的初学者,所以欢迎所有帮助!

BTW:在unix程序中工作,纯C编程

Ali*_*edi 5

管道是单向的,使用套接字对于一些小的ipc来说似乎很痛苦.

我建议你使用socketpair().您可以将它们视为双向管道.

这是一个示例,其中父级将一个字符发送给它的子级.然后,子级将其设置为大写并将其发送回父级.(这是来自beej的教程)

#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;
}
Run Code Online (Sandbox Code Playgroud)

您也可以轻松地为两个方向使用两个管道.