【问题标题】:C programming bi directional communicationC编程双向通信
【发布时间】:2015-09-06 17:41:20
【问题描述】:

我正在尝试在这里做一些事情,我有一个 c 程序,我的父进程在其中创建了一个管道,这样他就可以监听来自子进程的请求。这些孩子是动态创建的,它永远不会是相同的数字。到目前为止,我设法通过管道将请求发送给父级,并通过互斥锁同步。

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

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

所以现在我对如何使请求响应到达孩子一无所知... 我是 C 编程初学者,欢迎大家帮忙!

顺便说一句:在 Unix 程序中工作,纯 C 编程

【问题讨论】:

  • 您是否尝试过将管道描述符传递给子进程正在侦听响应的管道中的父进程?
  • 我们还能看到一些代码
  • 您可以给每个子进程一个输入管道和一个输出管道,父进程将使用另一端。如果您可以将stdinstdout 用于管道,那就更好了。套接字是另一种选择。 beej.us/guide/bgipc/output/html/singlepage/bgipc.html 是一个很好的信息来源。 Richard Stevens 的 UNIX 编程书籍也是如此。
  • @phyrrus 嗨!是的,我确实尝试过,但它不起作用,至少不是我所说的那样,它在孩子中调用 pipe(var[]) 并将 var[1] 粘贴到父级。父级不知道描述符 id:/
  • @PSkocik 但没有用于 tcp ip 通信的套接字?也可以在本地使用吗?

标签: c unix multiprocessing ipc


【解决方案1】:

管道是单向的,使用套接字对于一些 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;
}

您还可以轻松地为您的两个方向使用两个管道。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2011-10-12
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多