2015-06-21 74 views
2

我想在这里做一些工作,我有c程序,我的父进程创建一个管道,以便他可以听取来自子进程的请求。这些孩子是动态创建的,它永远不会是同一个号码。到目前为止,我设法通过管道将请求发送给父级,并通过互斥体同步它。C编程双向通信

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

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

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

BTW:在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的教程)

#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; 
} 

你也可以在两个方向上轻松使用两根管道。