我试图编写一个客户机服务器程序,其中有三个可执行文件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);
}我试过dup2(fd,fd1),但没有成功。有任何方式连接两个文件描述符fd和fd1吗?
另外,如果另一个客户端请求D1,如何将client2的文件描述符连接到fd,以便两个客户端一起接收相同的消息?
发布于 2019-01-22 15:11:11
您可以将文件描述符发送到客户端并让客户端读取,而不是“连接”两个文件描述符:
popen并获取文件描述符。有关在使用man unix(7)的进程之间发送文件描述符的详细信息,请参见SCM_RIGHTS。
或者,而不是使用popen
fork本身。子程序执行mkfifo (客户端在请求中传递文件名),open对其进行写入,并将其stdout重定向到命名管道的文件描述符。exec是应用程序。这个应用程序写入stdout,然后进入命名管道。unlink。https://stackoverflow.com/questions/54309843
复制相似问题