我正在为大学开展一个项目,我只能使用命名管道(mkfifo())来建立服务器和终端之间的通信(两者都由我创建)。
有:
实际上我的应用程序是这样的:
问题:
如果我只使用一个线程启动服务器,这一切都正常,因为响应(reply_t)按照命令到达的顺序发送( command_t )
但是,如果我使用多个线程启动服务器,我无法保证响应按照命令到达的相同顺序发送,这将使我有混合响应(类似于,我将在终端上收到1从终端2等命令执行的结果...)。
在这个解决方案中,我将为连接到服务器的每个终端输出PIPE,而不是在所有终端之间共享一个输出PIPE。但是如何在C中实现可变数量的终端?我甚至无法检测新终端何时打开输入PIPE。
有什么建议吗? 谢谢!
答案 0 :(得分: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 */
您可以在此处找到完整的说明: http://www.linuxhowtos.org/C_C++/socket.htm
在“服务器代码的增强”部分。
希望这有帮助。
答案 1 :(得分:0)
将服务器与终端同步的一种方法是使用System V semaphore。信号量在开始之前由终端占用&#34;听&#34;到&#34; x&#34;的频道分钟。如果消息到达,终端处理它并发回响应,否则,如果发生超时,它只是释放信号量,以便其他终端可以开始监听。这样做的问题是您无法并行处理多条消息。
另一种方法是@Moulin在结构fork()
和command_t
中使用id(例如reply_t
返回的PID)。