【问题标题】:Difference between Serial Port and Named Pipe串口和命名管道的区别
【发布时间】:2015-07-11 22:30:20
【问题描述】:
串行端口流和命名管道 (FIFO) 之间有区别吗?尤其是在 Linux 方面?
我的理解是:
- 是全双工的
- 可以由不相关的进程读取/写入(与常规管道的工作方式相反)
我能想到的唯一区别是:
- 串行端口具有实际硬件的文件描述符(硬件正在读取/写入),而命名管道只是在内核上创建的用于存储数据流的“文件”,然后 2 个(或更多?)进程可以连接和读/写。
- 是否有任何其他差异(如果有)?
另外,如果我在一个进程 P1 中创建了一个命名管道(并且我的另一个进程 P2 连接到它) - P1 可以使用该文件描述符来写入和读取这个命名管道吗? P2 也可以这样做(读写)。或者,如果我希望 P1 能够对 P2 进行读写操作,是否需要创建 2 个命名管道?实际用途是 P1 将命令写入 P2 并从 P2 读取这些命令的结果。
【问题讨论】:
标签:
c
linux
serial-port
pipe
named-pipes
【解决方案1】:
串行端口用于不同机器之间的通信,而不是用于同一机器内的 IPC。您可以为环回配置串行硬件,但串行端口硬件支持的最高数据速率远不及任何现代互连的速度——不是 USB 或 eSATA(对于名称中带有“串行”的其他接口),也不是网络互连,例如以太网(甚至是无线)。串行端口速度甚至与 FIFO 不在同一个太阳系中。
就其他特征而言,
- 串行端口将作为设备文件呈现给系统,FIFO 也将作为文件呈现
- 因此,每个进程都可以由多个不相关的进程同时打开,用于读取和写入
- 但是,您需要特殊权限才能创建串行端口特殊文件,加上它背后的实际硬件才能使其有用,而任何人都可以创建 FIFO
- 通过串口通信是双向的;它可以是全双工的,但也可以使用半双工模式。
- FIFO 是单向的,但如有必要,您可以成对使用它们。原则上,一个进程可以同时写入和读取 FIFO,但如果它想避免消耗自己的消息并避免死锁,则需要非常小心。
底线:对于一台机器内的双向 IPC,FIFO 远优于串行端口。您还应该考虑使用套接字接口。