Linux中的Windows NAmed Pipes替代方案

时间:2010-08-19 16:50:46

标签: linux named-pipes overlapped-io

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

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

你可以指导我这件事。

3 个答案:

答案 0 :(得分:4)

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(如果稍后再重复使用,则将其保留在那里)。
  8. 我不确定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()可以返回short,因此您需要查看返回值)。

    我不太确定Windows命名管道如何代表来自多个客户端的多个连接,但在UNIX中,每个连接获得一个文件描述符(另外一个用于“监听”套接字)。

答案 1 :(得分:0)

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

我非常确定的是,没有重叠I / O这样的东西,至少不像Windows中那样存在。与Windows相比,锁定原语也很糟糕,虽然套接字的内容往往表现得更好。

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

答案 2 :(得分:0)

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

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

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