关于命名管道,通常如何实现“握手”

Posted

技术标签:

【中文标题】关于命名管道,通常如何实现“握手”【英文标题】:How is a "handshake" generally implemented with regards to Named Pipes 【发布时间】:2009-08-03 02:46:48 【问题描述】:

我需要在一个使用命名管道与其他进程通信的小型 Linux 程序中实现握手类型协议。在使用命名管道时,我已经搜索了握手类型协议的通用实现模式,但我无法打开任何东西......

我简直不敢相信没有模式可以做到这一点。有人可以指出一个可能的资源吗?

完全公开,这是作业,但实施此模式不是作业。我们需要在作业代码中解决一个问题,我相信这是一个可能的解决方案。作业是用 C++ 实现的——但语言对我来说并不重要。我只是不想重新发明***......

更新:我感觉这可以用信号来实现。

我的意思是 握手 是子进程向其父进程报告它已准备好工作但没有继续(即使在pipe) 直到父级发出 go 信号。在我的工作理论中,我将有许多子进程需要报告就绪等待来自父进程的 go 信号。

【问题讨论】:

“Unix 环境中的高级编程”一书是一本了不起的书,它深入地涵盖了周围的问题。银(如果不是金)值得它的重量。 在旁注中,我现在明白为什么我无法找到有关此主题的任何内容。 这些技术的用途非常不寻常...... 【参考方案1】:

典型用法中,进程依靠阻塞来握手。 writer 进程打开管道进行写入,reader 进程打开管道进行读取,无论哪个先发生阻塞,直到另一个进程打开它的一侧。这可以扩展为在读取器端使用非阻塞 IO。

命名管道对于一对一的 IPC 最有用。在您的一对多情况下,您可能应该改用 UNIX 域套接字。

【讨论】:

这个作业与命名管道有关......所以我坚持使用给定的架构...... 好吧,每个子进程确实需要一个管道(如果您想要双向通信,则需要两个)。鉴于此,您可以让您的父进程一次打开所有管道,一旦所有 open() 调用返回,它就知道所有子进程都在运行并等待工作。

以上是关于关于命名管道,通常如何实现“握手”的主要内容,如果未能解决你的问题,请参考以下文章

命名管道如何识别客户端

C#命名管道,如何检测客户端断开连接

如何识别文件是不是是java中的命名管道

可以实现C++与PHP交互吗

Linux--进程通信

Linux--进程通信