Linux 中的 Windows 命名管道替代方案

Posted

技术标签:

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

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

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

你能指导我这件事吗?

【问题讨论】:

【参考方案1】:

Unix 套接字。本质上,

    致电socket(PF_UNIX, SOCK_STREAM, 0)。这将返回一个文件描述符或 -1 错误。 使用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); 之类的东西来创建套接字地址。 致电bind(fd, &addr, sizeof(addr))。 调用listen(fd,backlog) 来监听连接。 backlog 是可以存在的 un-accept()ed 连接数。 使用accept() 接受来自客户端的连接。这将返回一个新的 FD 或 -1 错误。 让客户端创建一个类似的套接字并 connect() 到该地址(我认为他们不必绑定)。 完成后删除文件 /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 套接字传递凭据,因此您需要设计您的协议,使其不需要它们。

【讨论】:

以上是关于Linux 中的 Windows 命名管道替代方案的主要内容,如果未能解决你的问题,请参考以下文章

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

Windows 8 命名管道创建

windows命名管道

windows命名管道

为啥命名管道是本地的?

Windows中的命名管道