我有兴趣编写独立的程序模块,作为独立的线程运行,我可以与管道连接在一起.我的动机是我可以完全独立地编写和测试每个模块,甚至可以用不同的语言编写它们,或者在不同的机器上运行不同的模块.这里有各种各样的可能性.我已经使用了一段时间的管道,但我不熟悉它的行为的细微差别.
哇,有很多问题。让我们看看我是否能涵盖所有内容......
接收端似乎会阻塞等待输入,这是我所期望的
您正确地期望实际的“读取”调用将被阻塞,直到有东西出现为止。然而,我相信有一些 C 函数可以让您“窥视”管道中等待的内容(以及数量)。不幸的是,我不记得这是否也被阻止。
发送端有时会阻塞等待某人从流中读取数据吗
不,发送永远不应该被阻止。想象一下如果这是通过网络连接到另一台计算机的管道,会产生什么后果。您是否想要等待(可能存在高延迟)另一台计算机响应它收到的消息?现在,如果目标的读取器句柄已关闭,则情况会有所不同。在这种情况下,您应该进行一些错误检查来处理该问题。
如果我向流写入 eof,我可以继续写入该流,直到关闭它吗
我认为这取决于您使用的语言及其管道的实现。在C语言中,我会说不。在 Linux shell 中,我会说是的。应该由更有经验的人来回答这个问题。
命名管道和未命名管道的行为有区别吗?据我所知,是的。但是,我对命名与未命名没有太多经验。我相信区别在于:
我首先使用命名管道打开管道的哪一端有关系吗?
通常不会,但是在尝试创建线程并将线程相互链接的初始化时可能会遇到问题。您需要有一个主线程来创建所有子线程并使它们各自的管道彼此同步。
不同 Linux 系统之间管道的行为是否一致?
同样,这取决于什么语言,但通常是的。听说过 POSIX 吗?这就是标准(至少对于linux来说,Windows有自己的事情)。
管道的行为是否取决于我正在使用的外壳或我配置它的方式?
这正进入一个灰色地带。答案应该是否定的,因为 shell 本质上应该进行系统调用。然而,在那之前的一切都是有待争夺的。
还有其他问题我应该问吗
您提出的问题表明您对系统有一定的了解。继续研究并关注您将要从事的级别(shell、C 等)。不过,只要尝试一下,你就会学到更多东西。