Windows和Linux应用程序之间的管道

问题描述:

如果我在同一个LAN上有Windows和Linux机器,我可以使用(命名)管道在两者之间进行通信吗?Windows和Linux应用程序之间的管道

我特别想到在Windows端使用C#或VB.NET中的System.IO.Pipes命名空间。

+0

命名管道很少用于机器间通信,为什么使用它们而不是TCP? –

+0

我只是在学习更多关于管道的过程。 Windows允许您在同一LAN上的Windows机器之间使用管道。 TCP更适合机器间通信吗? – mcu

单独命名管道无法通过IP完成此操作。最简单的解决方案是在每台机器上创建一个命名管道,并使用netcat(Linux中的nc)在管道之间发送信息。

我不知道如何在Windows工作,但我可以给Linux操作系统(相当,任何现代的Unix),这样做的一个例子,可能有一些简单的方法来做到适应本作的Windows:

machinea想与machineb交谈。在某些程序写入的/tmp/mypipe处打开命名管道。 B在某些程序读取的/tmp/mypipe处打开命名管道。 B运行nc -l 9000 > /tmp/mypipe侦听端口9000上的TCP/IP连接并将输出写入命名管道。 A运行cat /tmp/mypipe | nc machineb 9000从其命名的管道读取数据,并将读取的数据传输到netcat以将其发送到机器B.当然,在A和B上运行的程序并不关心管道信息是否通过TCP/IP; netcat可以处理这个问题,而且他们只是和他们的命名管道通话,但是他们应该这样做。

您可能需要摆弄打开命名管道的顺序,打开读取/写入命令的程序并运行netcat命令。我从记忆中回答这个问题。

命名管道为从不用于intermachine通信。命名管道是文件系统中的一个特殊的inode(使其具有与任何其他文件一样的名称)。一个进程调用open(2)用于读取或写入(通常一个进程打开它用于读取,另一个进程用于写入)以及其他进程通过指定的FIFO连接到它。命名的fifos是专门在内核中实现的,因为当FIFO为空时,从它读取的进程将被阻塞,等待它有数据。另外,当一个进程填满FIFO时(它们的容量有限,因为它们使用inode指针中的少量块---只有直接块),它在写入时被阻塞,直到某些阅读器清空FIFO数据。

由于文件系统中的一个文件只在承载它的服务器中可见,因此它没有网络可见性,并且不能用作网络通信机制。

对于网络通信,您有插座(2)(和朋友)接口。也存在所谓的Unix域套接字,它们是双向的(也必须连接它们)的套接字,但是仅适用于本地使用,主要是因为它们不使用完整的TCP/IP协议栈将一端连接到另一端。他们看上去像这样(在第一模式位置p)在LS(1)列表:

[email protected]:/run$ ll hogsuspend 
prw------- 1 root root 0 ago 10 16:54 hogsuspend 

和Unix套接字愿意这样做:

[email protected]:/run$ ll /dev/gpmctl 
srwxrwxrwx 1 root root 0 ago 10 16:54 /dev/gpmctl 

(与s

+0

https://msdn.microsoft.com/en-us/library/aa365590%28VS.85%29.aspx _Named管道可用于在同一台计算机上的进程之间或网络上不同计算机上的进程之间提供通信。 _ – mcu

+0

microsoft中的命名管道与unix/linux中的命名管道不同...... –

+0

@mcu,可能是这样,但它并不会使我的响应无效。没有看到以这种方式使其失效的理由。命名管道来通信网络间节点需要一些确保通信可用的方法,所以我无法想象简单的管道的“open”,“read”,“write”和“close”语义,而不需要OS提供更多的内核支持。无论哪种情况,问题都是** ...在Windows/Linux机器之间**,意味着互操作性。你有没有尝试过命名管道的Windows连接到Linux的命名管道?如果linux不支持它们,他们应该怎么做? –