【问题标题】:Unexpected behaviour of lseeklseek 的意外行为
【发布时间】:2021-08-23 05:07:36
【问题描述】:

我使用lseek 只是为了查找文件的大小,而lseek 返回的字节数少于文件的实际大小。我认为代码是正确的,我无法解释为什么会发生这种情况。

当我第一次运行该程序时,它运行良好。然后我在文件中添加了一些数据,所以它改变了它的大小。从那以后,当我用新文件再次运行程序时,结果总是旧文件的大小。

任何帮助表示赞赏!

int main(int argc,char* argv[]){
    int out_file_size=0;
    int fd_prognameout;

    fd_prognameout=open(argv[1],O_RDWR | O_CREAT,00700);

    if(fd_prognameout == -1){
        perror("Error:");
        return(0);
    }

    lseek(fd_prognameout,0,SEEK_SET);
    out_file_size = lseek(fd_prognameout,0,SEEK_END);
    lseek(fd_prognameout,0,SEEK_SET);

    printf("The size of out file is: %d\n",out_file_size);
    
    close(fd_prognameout);

    return(0);
}

【问题讨论】:

  • 请提供代码的minimal reproducible example。如果只是 lseek 您有问题,那么您不需要在 lseek 调用之后显示大部分代码。提供查看问题所需的最少代码量以及调试信息,例如文件列表。
  • 您是否有可能在不同目录中有两个同名文件,并且正在修改您的程序未打开的文件?
  • @RetiredNinja 感谢您的帮助。我再次运行程序,问题就消失了。我不知道怎么做。也许就像你说的那样。但事实是我没有更改我的代码,也没有更改文件名。如果您有任何想法,请告诉我。
  • @GrigoriosGaroufalis 那么你的代码很可能包含未定义的行为。
  • 我使用 lseek 只是为了查找文件的大小 它可以工作,但它不是线程安全的,你可以使用 fstat()

标签: c unix lseek


【解决方案1】:

首先,让我们改变这些行

lseek(fd_prognameout,0,SEEK_SET);
out_file_size = lseek(fd_prognameout,0,SEEK_END);
lseek(fd_prognameout,0,SEEK_SET);

//get the current file position
off_t current_pos = lseek(fd_prognameout,0,SEEK_CUR);
//get the last position (size of file)
off_t out_file_size = lseek(fd_prognameout,0,SEEK_END);
//reset to the previous position
lseek(fd_prognameout,current_pos,SEEK_SET);

现在解决您的问题。对文件的修改可能不会立即可见(由于内核的缓存/缓冲)。 修改文件后,运行命令sync 或在代码中调用函数fsync()fdatasync()

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2020-10-04
  • 2016-07-16
  • 2016-05-10
  • 2020-07-23
  • 2021-11-16
  • 2017-10-20
  • 2016-06-29
相关资源
最近更新 更多