【问题标题】:fstat() return 0, with file size 0 and errno 11fstat() 返回 0,文件大小为 0,errno 为 11
【发布时间】:2015-07-08 13:50:11
【问题描述】:

我正在我的代码中尝试以下内容:-

{

   int y,n_bytes;

   struct stat temp_data;

   y = fstat(netdev->queue_fd[class_id],&temp_data);
   printf("Success - %d , size -> %lld , Error- %d \n",y,temp_data.st_size,errno);
   n_bytes = write(netdev->queue_fd[class_id],buffer->data,buffer->size);
   y = fstat(netdev->queue_fd[class_id],&temp_data);
   printf("After write Success - %d , size -> %lld , Error- %d and the value of n_bytes is - %d ",y,temp_data.st_size,errno,n_bytes);

}

我得到的输出是:-

Success - 0, size -> 0 , Error - 11 
After write Success - 0, size -> 0, Error - 11 and the value of n_bytes is - 1526 

大小为0,错误号为11的原因是什么? 有没有其他方法可以获取文件的大小??

注意:这里的Netdev->queue_fd[class_id] 是一个文件描述符。 在不同的调用中,n_bytes 的值在 {41,1514,66,..} 之间变化。 (总是大于 0)

谢谢

【问题讨论】:

    标签: c linux file-handling fstat


    【解决方案1】:

    Netdev->queue_fd[class_id]是一个文件描述符

    • 普通文件或
    • 任何 sys/fs 条目或
    • 字符/块/网络设备文件?

    如果不是常规文件,则写入命令后其大小不会更新

    通过S_ISREG()检查文件类型

    【讨论】:

    • 我现在对问题进行了更改。 n_bytes 的返回值总是大于 0。所以它总是至少在写一些东西。
    • @SumitPaliwal 我也更新了我的答案。现在检查文件类型?
    • 感谢您的回复。。我检查了文件类型。。它不是普通文件,它是 SOCKET。那么有什么方法可以知道这个文件里面写入了多少数据呢??
    • 那么你的文件描述符的类型是什么?如果我的回答对你有帮助,那么你可以点击右键接受我的回答
    • 所以它不是一个常规文件,所以大小不能由 fstate 导出。对于此套接字,您可以维护计数器。在每次 write() 之后,您可以按其返回值递增它。
    【解决方案2】:
    1. 成功后errno的状态无关紧要。 errno 的值仅在失败时修改。 fstat() 返回零,所以 errno 的值无关紧要。

    2. write() 返回什么?您没有进行检查,因此您不知道在write() 调用之后文件应该更大。

    【讨论】:

    • 根据您的建议,我现在检查了 n_bytes 的返回值,在不同的调用中随机为 90,66 和 1523。所以它正在写一些东西。但是其余的输出还是一样的。
    • temp_data.st_sizeoff_t,而不是 long long int... 因此将其作为与 %lld 对应的参数提供会调用未定义的行为。也许您可以使用%llu 并像这样转换该论点:(unsigned long long) temp_data.st_size...
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2021-08-14
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多