我们正在将现有的 Windows 代码移植到 Linux。我们使用 ACE 作为抽象层。我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作。
在linux中与此等效的是什么。我检查了 linux 命名管道(FIFO),但它们似乎只支持一个客户端和服务器,不支持重叠 IO。
你能指导我这件事吗?
我们正在将现有的 Windows 代码移植到 Linux。我们使用 ACE 作为抽象层。我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作。
在linux中与此等效的是什么。我检查了 linux 命名管道(FIFO),但它们似乎只支持一个客户端和服务器,不支持重叠 IO。
你能指导我这件事吗?
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
是可以存在的未接受()连接的数量。我不确定 Unix 套接字是否支持 SOCK_DGRAM(如果支持,它可能类似于 UDP)。
请参阅 socket(2)、bind(2)、listen(2)、accept(2)、connect(2)、unix(4)、setsockopt(2) 的手册页。
对于“重叠 I/O”,请参见 select(2)。您还可以使用(参见 fcntl(2))启用非阻塞 IO fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK))
,这意味着 read() 和 write() 永远不会阻塞(这意味着 write() 可以返回短,因此您需要查看返回值)。
我不太确定 Windows 命名管道如何表示来自多个客户端的多个连接,但在 UNIX 中,每个连接都有一个文件描述符(加上一个用于“侦听”套接字)。
如果我记得的话,我认为他们会使用 fork() 和 stdin/stdout 和/或套接字。我已经在 Python 中完成了它,但是它有一个很好的非常高级的 IPC 包装器,所以我不确定它在 *nix 上是如何工作的。
我很确定的是,不存在重叠 I/O 之类的东西,至少在 Windows 中不存在。与 Windows 相比,锁定原语也有点糟糕,尽管套接字的东西往往表现得更好。
因此,请查看fork()
与 IPC 相关的内容。您可能还想投资一个好的参考。我认为那本书相当于 Windows 中的 Hart tome。
如果通信是本地的,请使用 unix 域套接字或 TCP 套接字。Unix 域套接字可以接收调用进程的凭据。
如果它在网络上,请使用 TCP 套接字。
请注意,不支持 Windows 命名管道的某些功能 - 您无法通过 TCP 套接字传递凭据,因此您需要设计您的协议,使其不需要它们。