我从来不确定我应该传递给fdopen的是什么开放模式,也不知道为什么它会有一个开放模式。因为fdopen对一个文件描述符进行操作,该描述符以前可能是通过较低级别的调用(如open )打开的--该调用已经设置了模式标志。
我的意思是,我假设fopen的任何实现都只需将char*模式字符串转换为较低级别的模式标志类型( POSIX系统上的OR'd int ),然后将其传递给open。
但是,如果我们在调用fdopen时有一个来自以前调用open的现有文件描述符,那么为什么我们需要标志呢?它似乎为程序员创造了更多的工作,将int标志转换为fdopen的char*标志。
我是不是遗漏了一些用例,我们可能需要为open和fdopen使用不同的标志
发布于 2014-11-14 17:44:15
也许你想把O_RDWR传给open(2),然后把"r"传给fdopen(3)。这是完全合法的做法。也许是其他人代表您调用了open(2)和/或fdopen(3)。
发布于 2014-11-14 18:01:44
凯文分享了正确的想法。
FILE *和fd由不同的实例管理。因为开放模式很可能是硬编码的,所以程序员输入两次就很简单了。
确实有些情况下,您需要先在fd中打开一些东西,然后将其包装到FILE *中。例如,在我尝试在我自己的项目中提供一个串口接口之前,我必须使用open打开它,这样我就可以在它上操作ioctl,termios,最后,我用一个FILE *包装它,这样外部世界就可以使用fgets或类似的东西了。
发布于 2014-11-14 17:56:58
引用GNU文件:
文件描述符为输入和输出操作提供了一个基本的、低级的接口.如果您希望执行特定于特定类型设备的控制操作,则必须使用文件描述符;没有以这种方式使用流的工具。
文件描述符和流都可以表示到设备(例如终端)的连接,或者用于与另一个进程通信的管道或套接字,以及普通文件。
fdopen()函数将流与现有的文件描述符fd相关联。流的模式(值"r“、"r+”、"w“、"w+”、"a“、"a+")必须与文件描述符的模式兼容。fopen()函数打开名称为路径指向的字符串的文件,并将流与其关联。
通常,文件描述符不像流那样可移植。
有关更多信息,请查看此链接:node/Streams-and-File-Descriptors.html
https://stackoverflow.com/questions/26935621
复制相似问题