虽然笔者认可不重复发明轮子
的理论,但是,在遇到具体问题的时间,如果你不知道一个具体的API
,还是会陷入重复制造的麻烦当中。
笔者遇到的问题,是父进程从父子进程之间的pipe
,按行工作协议读取子进程的行输出。
但是,因为不知道fdopen
函数的存在,原来也曾蹩脚地写过解析行的小函数,而且正确性还没有办法一下子保证正确 😦
在用fdopen
将pipe
文件句柄转换为文件流对象后,您立马可以直接使用工业级的fgets stream API
!
如果,是文件系统的文件流操作,还是建议直接使用f* stream APIs
,不用fdopen
进行转换 。。。
注意事项
fdopen
后句柄所有权将发生转移,后期必须使用fclose
进行关闭文件流对象fcntl
设置pipe文件句柄的O_NONBLOCK
选项,对于fgets
存在影响,建议在非阻塞场景,必须设置-
waitpid(childpid, &status, WNOHANG | WEXITED) == 0
检测子进程是否已退出
遗留问题
- 文件流操作在
f* API
体系中是否可独立设置阻塞非阻塞状态?