首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接一个管道的输出到一个FIFO的输入端

连接一个管道的输出到一个FIFO的输入端
EN

Stack Overflow用户
提问于 2019-01-22 13:54:01
回答 1查看 143关注 0票数 0

我试图编写一个客户机服务器程序,其中有三个可执行文件D1、D2和D3,它们提供一些数据作为输出。客户端请求这些数据源中的任何一个,并在通用fifo的帮助下将它们的pid发送到服务器。发送此请求的结构是:

代码语言:javascript
复制
struct Request
{
    char p[10]; // the pid of the client program in string form
    int req; // 1,2,or 3 depending on which one is required D1,D2 or D3
};

获得请求后,服务器将打开一个fifo,其路径名为客户端的pid。因此,它作为特定于客户端的fifo工作。

代码语言:javascript
复制
mkfifo(pid,O_CREAT|0666);
int fd1 = open(pid,O_WRONLY);

现在,假设req字段为1。如果它是D1的第一个请求,服务器将运行:

代码语言:javascript
复制
FILE* fp = popen("./D1","r");
int fd = fileno(fp); //for getting the file descriptor for the reading end of the pipe connected to D1

现在,我希望我的客户从D1.D1的管道中读取包含以下简单逻辑程序的内容:

代码语言:javascript
复制
while(1)
{
    write(1,"Data from D1",12);
    sleep(1);
}

我试过dup2(fd,fd1),但没有成功。有任何方式连接两个文件描述符fd和fd1吗?

另外,如果另一个客户端请求D1,如何将client2的文件描述符连接到fd,以便两个客户端一起接收相同的消息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-22 15:11:11

您可以将文件描述符发送到客户端并让客户端读取,而不是“连接”两个文件描述符:

  1. 服务器监听UNIX流套接字。
  2. 客户端连接套接字并发送请求。
  3. 服务器接收请求,执行popen并获取文件描述符。
  4. 然后,服务器向客户端发送文件描述符并关闭文件描述符。
  5. 客户端接收文件描述符并从中读取到EOF。

有关在使用man unix(7)的进程之间发送文件描述符的详细信息,请参见SCM_RIGHTS

或者,而不是使用popen

  1. 服务器fork本身。子程序执行mkfifo (客户端在请求中传递文件名),open对其进行写入,并将其stdout重定向到命名管道的文件描述符。
  2. exec是应用程序。这个应用程序写入stdout,然后进入命名管道。
  3. 客户端打开命名管道并读取应用程序的输出。客户端可以在打开管道文件名后对其进行unlink
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54309843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档