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 命名管道替代方案的主要内容,如果未能解决你的问题,请参考以下文章