gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:41 36 4
gpt4 key购买 nike

我正在测试来自 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(Darwin 内核 13.4)和 Ubuntu(内核 3.13)上得到了相同的结果。


更新:哦,打错了,应该引用fdoutargv[2] , 和 O_TRUNC标志肯定使fdin归零。我应该关闭还是删除这个问题?

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

sleep 前或匆忙中不要问 SO 问题。

最佳答案

好的,真正的问题是双重打开同一个输入文件,这不会导致任何构建或运行时错误,直到 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 寻求帮助

关于c - 为什么 stat 和 fstat 返回 st_size == 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26891373/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com