Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将一个管道的输出连接到一个FIFO的输入_Unix_Pipe_Client Server_Fifo - Fatal编程技术网

Unix 将一个管道的输出连接到一个FIFO的输入

Unix 将一个管道的输出连接到一个FIFO的输入,unix,pipe,client-server,fifo,Unix,Pipe,Client Server,Fifo,我试图编写一个客户机-服务器程序,其中有三个可执行文件D1、D2和D3,它们提供一些数据作为输出。客户机请求这些数据源中的任何一个,并在公共fifo的帮助下将其pid发送到服务器。发送此请求的结构是: 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

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

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工作

mkfifo(pid,O_CREAT|0666);
int fd1 = open(pid,O_WRONLY);
现在,假设req字段为1。如果是D1的第一个请求,服务器将运行:

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包含简单的逻辑程序,如:

while(1)
{
    write(1,"Data from D1",12);
    sleep(1);
}
我试过dup2fd,fd1,但不起作用。有没有办法连接两个文件描述符fd和fd1

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

您可以将文件描述符发送到客户端,让客户端读取:

服务器侦听UNIX流套接字。 客户端连接套接字并发送请求。 服务器接收请求,执行popen并获取文件描述符。 然后,服务器将文件描述符发送到客户端并关闭文件描述符。 客户端接收文件描述符并从中读取,直到EOF。 有关在具有SCM\U权限的进程之间发送文件描述符的详细信息,请参阅

或者,代替使用popen:

服务器自行分叉。当客户端在请求中传递文件名,打开它进行写入,并将其标准输出重定向到命名管道的文件描述符中时,子进程不执行mkfifo。 子对象执行应用程序。此应用程序写入stdout,并将其写入命名管道。 客户端打开命名管道并读取应用程序的输出。客户端可以在打开管道文件名后取消其链接。
这当然是一个有效的解决方案,但如果我不想使用套接字怎么办?@Ricky是什么阻止你使用UNIX套接字的?事实上,我正在学习一门关于计算机网络的入门课程,套接字还没有介绍。这个问题是一个赋值:@Ricky在这种情况下,服务器必须从popen文件描述符读取数据,然后写入客户端的fifo。@Ricky为您添加了另一种方法。