【问题标题】:interchangeably using FILE pointer and file descriptor交替使用 FILE 指针和文件描述符
【发布时间】:2020-08-13 05:35:08
【问题描述】:

我如何确保FILE* 文件描述符状态在我调用较低级别的函数 API 时保持同步,例如在 fileno() 函数给出的文件描述符上读取/写入而不是调用 fread/fwrite。 我想到的场景是:

fp = fopen(...)
fd = fileno(fp)
read(...,fd)

在上述read(...,fd) 之后,我希望fp (FILE*) 在读取字节后正确定位。 ftellfeof 应该仍然指向正确的信息。

【问题讨论】:

    标签: linux file io


    【解决方案1】:

    这个问题比你想象的要复杂:

    基于 FILE* 的 API(例如 fread())使用内部缓冲区,并且根据您使用的 C 库(版本),您必须考虑...

    • ...fopen()可能已经将字节读入缓冲区,所以fp的文件指针为0,但fd的文件指针不为0。

      这意味着在使用fd 之前,您必须确保fdfp 同步。

    • ... C 库可能会假设 fd 的文件指针仅由基于 FILE 的调用修改。

      这意味着你必须在使用read()和调用任何基于FILE的函数之间恢复fd的文件指针。

    所以下面的代码可能会起作用:

    fp = fopen(...)
    fd = fileno(fp)
    /* Remember file position of fd */
    oldpos = lseek(fd, 0, 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, 0, 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 库。)

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2023-04-04
      • 2010-12-08
      • 2011-03-11
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2018-03-14
      • 2020-09-06
      相关资源
      最近更新 更多