【问题标题】:Windows NAmed Pipes alternative in LinuxLinux 中的 Windows 命名管道替代方案
【发布时间】:2010-08-19 16:50:46
【问题描述】:

我们正在将现有的 Windows 代码移植到 Linux。我们使用 ACE 作为抽象层。 我们正在使用 Windows 命名管道与多个客户端进行通信并执行重叠操作。

在 linux 中与 this 等价的是什么。我检查了linux命名管道(FIFO),但它们似乎只支持一个客户端和一个服务器,不支持重叠IO。

你能指导我这件事吗?

【问题讨论】:

    标签: linux named-pipes overlapped-io


    【解决方案1】:

    Unix 套接字。本质上,

    1. 致电socket(PF_UNIX, SOCK_STREAM, 0)。这将返回一个文件描述符或 -1 错误。
    2. 使用struct sockaddr_un addr; bzero(addr); addr.sun_len = sizeof(addr); addr.sun_family = PF_UNIX; strncpy(addr.sun_path, "/path/to/file", sizeof(addr.sun_path)-1); 之类的东西来创建套接字地址。
    3. 致电bind(fd, &addr, sizeof(addr))。
    4. 调用listen(fd,backlog) 来监听连接。 backlog 是可以存在的 un-accept()ed 连接数。
    5. 使用accept() 接受来自客户端的连接。这将返回一个新的 FD 或 -1 错误。
    6. 让客户端创建一个类似的套接字并 connect() 到该地址(我认为他们不必绑定)。
    7. 完成后删除文件 /path/to/file(或者如果您以后要重复使用它,则将其保留在那里)。

    我不确定 Unix 套接字是否支持 SOCK_DGRAM(如果支持,它可能类似于 UDP)。

    参见 socket(2)、bind(2)、listen(2)、accept(2)、connect(2)、unix(4)、setsockopt(2) 的手册页。

    有关“重叠 I/O”,请参阅 select(2)。您还可以使用fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK)) 启用非阻塞 IO(参见 fcntl(2)),这意味着 read() 和 write() 永远不会阻塞(这意味着 write() 可以返回短,因此您需要查看返回值)。

    我不太确定 Windows 命名管道如何表示来自多个客户端的多个连接,但在 UNIX 中,每个连接都有一个文件描述符(加上一个用于“侦听”套接字)。

    【讨论】:

      【解决方案2】:

      如果我记得的话,我认为他们会使用 fork() 和 stdin/stdout 和/或套接字。我已经在 Python 中完成了它,但是它有一个很好的非常高级的 IPC 包装器,所以我不确定它在 *nix 上是如何工作的。

      我可以肯定的是,不存在重叠 I/O 之类的东西,至少在 Windows 中不存在。与 Windows 相比,锁定原语也有点糟糕,尽管套接字的行为往往更好。

      因此,请查看fork() 及其周围与 IPC 相关的内容。您可能还想投资一个好的reference。我认为这本书相当于 Windows 中的 Hart tome。

      【讨论】:

        【解决方案3】:

        如果通信是本地的,请使用 unix 域套接字或 TCP 套接字。 Unix 域套接字可以接收调用进程的凭据。

        如果它在网络上,请使用 TCP 套接字。

        请注意,Windows 命名管道的某些功能不受支持 - 您无法通过 TCP 套接字传递凭据,因此您需要设计您的协议,使其不需要它们。

        【讨论】:

          猜你喜欢
          • 2015-08-14
          • 2018-05-03
          • 2013-07-31
          • 2012-06-13
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 2017-09-17
          • 2012-09-09
          相关资源
          最近更新 更多