【发布时间】:2023-03-10 23:09:01
【问题描述】:
我确实使用 C 代码写入磁盘。
首先我尝试了malloc,发现write不起作用(write返回-1):
fd = open('/dev/sdb', O_DIRECT | O_SYNC | O_RDWR);
void *buff = malloc(512);
lseek(fd, 0, SEEK_SET);
write(fd, buff, 512);
然后我用这个更改了第二行并且它起作用了:
void *buff;
posix_memalign(&buff,512,512);
但是,当我将 lseek 偏移量更改为 1:lseek(fd, 1, SEEK_SET); 时,写入不再起作用。
首先,为什么 malloc 不起作用?
然后,我知道在我的情况下,posix_memalign 保证内存对齐的起始地址必须是 512 的倍数。但是,内存对齐和写入不应该是一个单独的过程吗?那么为什么我不能写入任何我想要的偏移量呢?
【问题讨论】:
-
你检查
malloc,write的返回了吗?? -
当我说
write没有工作时,这意味着retval = -1。而且我检查了 malloc 没有返回 null。 @ameyCU -
linux中以
/dev开头的名字是特殊的块设备。如果你指定一个实际的文件会发生什么? -
@Vincentius:那么你应该检查
errno。 -
这是一个完整的例子吗?因为一个新的
malloc()ed 缓冲区具有未初始化的字节,如果您尝试从它读取而之前没有写入它,则行为是未定义的。因此,特别是,可以将任何内容或任何内容都写入文件。也许您想使用calloc来获得一个充满零字节的缓冲区?