C/Linux - 服务器< - >与命名管道的终端通信

Dan*_*ira 8 c linux bash multithreading

我正在为大学开展一个项目,我只能使用命名管道(mkfifo())来建立服​​务器和终端之间的通信(两者都由我创建).

有:

  • 只有1台服务器;
  • 1个或更多终端;

实际上我的应用程序是这样的:

在此输入图像描述

  • 终端通过命名管道(红色)向服务器发送command_t结构.这个命名管道是一个FIFO,它在所有终端之间共享.在发送command_t strucutre之后,终端将尝试从另一个命名管道(蓝色)读取回复,并且它将被阻塞,直到服务器在该管道中写入内容.
  • 服务器从命名管道(红色)读取并按先来先服务的方式处理接收到的命令(command_t结构).有几个线程意味着同时处理多个请求.
  • 处理完命令后,服务器通过另一个命名管道(蓝色)发送reply_t结构.

问题:

如果我只使用一个线程启动服务器,这一切都正常,因为响应(reply_t)按命令到达的顺序发送(command_t)

但是,如果我使用多个线程启动服务器,我无法保证响应以命令到达的相同顺序发送,这将使我得到混合响应(类似于,我将在终端1上收到结果从终端2等命令执行...).

我在考虑制作这样的东西: 在此输入图像描述

在这个解决方案中,我将为连接到服务器的每个终端输出PIPE,而不是在所有终端之间共享一个输出PIPE.但是如何在C中实现可变数量的终端?我甚至无法检测新终端何时打开输入PIPE.

有什么建议?谢谢!

小智 1

丹尼尔,

我之前实现了一个类似的服务器,您可以监听终端,当终端完成消息时,您可以分叉进程并将响应发送回子进程,而在循环中的父进程中,您可以为下一个进程创建另一个监听器终端,正如 ccarton 所说:

像这样的东西:

while (1)
 {
   newsockfd = accept(sockfd,
               (struct sockaddr *) &cli_addr, &clilen);
   if (newsockfd < 0)
     error("ERROR on accept");
   pid = fork();
   if (pid < 0)
     error("ERROR on fork");
   if (pid == 0)
   {
     close(sockfd);
     dostuff(newsockfd);
     exit(0);
   }
   else
     close(newsockfd);
 } /* end of while */
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到完整的解释: http: //www.linuxhowtos.org/C_C++/socket.htm

在“服务器代码的增强”部分下。

希望这可以帮助。