我正在编写一个 C++ 套接字库来处理管理套接字相关系统调用的复杂性。我很好奇使用
FILE*
创建
fdopen(3)
并将其与客户端的原始文件描述符一起使用是否有任何有害的副作用。
我希望能够做到这一点,因为它提供了更大的灵活性,能够使用诸如
select(2)
之类的东西,同时也使用getline(3)
(这个问题的主要目标),但是我担心FILE*
会导致基于文件描述符的实用程序出现一些问题(即 FILE*
的内部缓冲会干扰 select(2)
确定是否有可用于 read(2)
的数据的能力)。
同时使用文件描述符及其关联的 FILE* 流是否安全?
必须特别注意遵守 https://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_05.html#tag_02_05_01 中 posix 规范制定的规则。
一般情况下,从FILE切换到fd之前先进行fflush。从 fd 切换到 FILE 时恢复文件偏移(如果发生更改)。
能够使用 select(2) 之类的东西,同时也使用 getline(3)
你“安全”了。 select 不影响文件描述符的文件偏移量。只要您不对 fd 调用任何其他可能影响文件位置的调用,您就可以混合使用 fd 上的 select 和 FILE 上的 getline。
但是要注意,select 可以返回数据可用,但流中没有换行符。因为您必须通过阻塞或以非阻塞模式处理部分行来处理它。无论如何,您最好在 fd 上的 select 循环中实现自己的行缓冲区或创建一个线程来阻止 getline 。