如何解决使用FILE指针和文件描述符可互换
当我调用低级函数API(例如,对FILE*
函数给定的文件描述符的读/写而不是调用{{1})时,如何确保fileno()
文件描述符状态保持同步} / fread
。
我想到的场景是:
fwrite
在上述fp = fopen(...)
fd = fileno(fp)
read(...,fd)
之后,我希望在读取字节之后正确放置read(...,fd)
(fp
)。 FILE*
和ftell
仍应指向正确的信息。
解决方法
此问题比您想象的要复杂:
基于FILE*
的API(例如fread()
)使用内部缓冲区,并且根据您使用的C库(版本),您必须考虑...
-
...
fopen()
可能已经将字节读入缓冲区,因此fp
的文件指针为0,但是fd
的文件指针不为0。 / p>这意味着在使用
fd
之前,必须确保fp
与fd
保持同步。 -
... C库可能会假设
fd
的文件指针只能通过基于FILE
的调用来修改。这意味着您必须在使用
fd
和调用基于read()
的任何函数之间恢复FILE
的文件指针。
因此以下代码可能有效:
fp = fopen(...)
fd = fileno(fp)
/* Remember file position of fd */
oldpos = lseek(fd,SEEK_CUR);
/* Ensure file position of fd is in sync with fp */
lseek(fd,ftell(fp),SEEK_SET);
read(...,fd)
/* Get new file position of fd */
newpos = lseek(fd,SEEK_CUR);
/* Restore old file position of fd */
lseek(fd,oldpos,SEEK_SET);
/* Keep fp in sync with fd */
fseek(fp,newpos,SEEK_SET);
(但是,不能保证此代码可与每个存在的C库一起使用。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。