首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/Linux <->终端与命名管道的通信

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

Stack Overflow用户
提问于 2016-12-02 02:21:57
回答 2查看 1.4K关注 0票数 8

我正在为大学做一个项目,在这个项目中,我只能使用命名管道(mkfifo())在服务器和终端(两者都由我创建)之间建立通信。

有:

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

实际上,我的应用程序的工作方式如下:

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

问题:

如果我只用一个线程启动服务器,所有这些都可以正常工作,因为响应(reply_t)是按照命令到达的顺序发送的(command_t)。

但是,如果我用多个线程启动服务器,我不能保证按照命令到达的相同顺序发送响应,这将使我有混合的响应(例如,我将在终端1上接收来自终端2的命令执行的结果,等等)。

我在考虑做这样的事情:

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

有什么建议吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2017-01-13 06:07:42

丹尼尔,

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

就像这样:

代码语言:javascript
复制
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 */

您可以在这里找到一个完整的解释:C++/socket.htm

在“增强服务器代码”一节下。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-09-07 20:11:42

将服务器与终端同步的一种方法是使用V系统信号量。信号量由终端在开始“听”频道"x“分钟之前被接收。如果消息到达,终端处理它--发送回响应,否则,如果发生超时,它只是释放信号量,以便其他终端可以开始侦听。这方面的问题是,您失去了并行处理多条消息的能力。

另一种方法是@Moulin,据说它在结构fork()reply_t中使用id (例如,由reply_t返回的PID )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40923725

复制
相关文章

相似问题

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