繁体   English   中英

为什么stat和fstat返回st_size == 0?

[英]Why stat and fstat return the st_size == 0?

我正在测试来自APUE的代码,在内存映射文件的第14章( 高级I / O )中, fstat()始终将fdinst_size返回为零,而我尝试使用stat()来获得相同的结果。 我在下面列出了代码(我已经删除了apue.h依赖项):

#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#define COPYINCR (1024*1024*1024) /* 1GB */

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("usage: %s <fromfile> <tofile>", argv[0]);
        exit(1);
    }

    int fdin, fdout;
    if ((fdin = open(argv[1], O_RDONLY)) < 0) {
        printf("can not open %s for reading", argv[1]);
        exit(1);
    }

    if ((fdout = open(argv[2] /* typo fix */, O_RDONLY | O_CREAT | O_TRUNC)) < 0) {
        printf("can not open %s for writing", argv[2]);
        exit(1);
    }

    struct stat sbuf;
    if (fstat(fdin, &sbuf) < 0) { /* need size fo input file */
        printf("fstat error");
        exit(1);
    }


    // always zero, and cause truncate error (parameter error)
    printf("input_file size: %lld\n", (long long)sbuf.st_size); 

    if (ftruncate(fdout, sbuf.st_size) < 0) { /* set output file size */
        printf("ftruncate error");
        exit(1);
    }

    void *src, *dst;
    off_t fsz = 0;
    size_t copysz;
    while (fsz < sbuf.st_size) {
        if (sbuf.st_size - fsz > COPYINCR)
            copysz = COPYINCR;
        else
            copysz = sbuf.st_size - fsz;

        if (MAP_FAILED == (src = mmap(0, copysz, PROT_READ,
                        MAP_SHARED, fdin, fsz))) {
            printf("mmap error for input\n");
            exit(1);
        }

        if (MAP_FAILED == (dst = mmap(0, copysz,
                            PROT_READ | PROT_WRITE,
                            MAP_SHARED, fdout, fsz))) {
            printf("mmap error for output\n");
            exit(1);
        }

        memcpy(dst, src, copysz);
        munmap(src, copysz);
        munmap(dst, copysz);

        fsz += copysz;
    }

    return 0;
}

然后我尝试了Python os.stat ,它也得到了零结果,为什么会这样呢? 我已经尝试过这些,并且在Mac OS(达尔文内核13.4)和Ubuntu(内核3.13)上也得到了相同的结果。


更新 :哦,有一个拼写错误,我应该将fdout指向argv[2] ,并且O_TRUNC标志肯定会使fdin变为零。 我应该关闭还是删除此问题?

Python的os.stat()也返回(stat.st_size == 0)是我通过了相同的测试文件argv[1] )进行测试,并且该文件先前已被截断为零(我还没有)在传递给os.stat()之前使用ls -lh检查其大小,当然os.stat()返回零。

在上床或匆忙之前不要问SO问题。

好了,真正的问题是双open相同的输入文件,这不会导致任何编译或运行时错误,直到ftruncate()

第一个open获取只读的fdin ,第二个open创建一个新文件( fdout并被截断)以通过内存映射从fdin复制,第二个打开截断第一个文件( argv[1] ),并清除了所有内容。 但是fdin 仍然fstat 一起使用(当然),这使我很难找到原因。

第二部分是我始终使用相同的文件进行测试(通过dd生成),并且没有检查大小,因此os.stat(/path/to/file)stat(/path/to/file) 也返回 st_size == 0 ,这使我相信这一定是某些操作系统级别的行为定义的行为,我急于使用相同的输入代码输入Mac OS,并获得了相同的结果(它们在POSIX级别上确实一致,错误!),最后,我来到SO寻求帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM