【发布时间】:2019-05-23 01:29:35
【问题描述】:
我正在编写一些像 Bittorrent 客户端这样的应用程序来从网络下载文件并将其写入本地文件。我将获取部分数据并写入文件。
比如我要下载一个1GB的文件,我会得到offset 100, data: 312 bytes、offset 1000000, data: 12345、offset 4000000, data: 888 bytes。
我使用的是 Linux 原生 AIO(io_setup,io_submit,io_getevents),我发现了这个
使用linux内核AIO时,文件需要以O_DIRECT模式打开。这引入了对所有读写操作的进一步要求,以使其文件偏移、内存缓冲区和大小对齐到 512 字节。
那么我怎样才能将数据写入一些不是 512 对齐的偏移量?
例如,首先我将 4 个字节写入文件,所以我必须这样做:
fd = open("a.txt", O_CREAT | O_RDWR | O_DIRECT, 0666);
struct iocb cb;
char data[512] = "asdf";
cb.aio_buf = ALIGN(data, 512);
cb.aio_offset = 512;
cb.aio_nbytes = 512;
那我想在asdf后面追加数据:
struct iocb cb2;
char data2[512] = "ghij";
cb2.aio_buf = ALIGN(data2, 512);
cb2.aio_offset = 5;
cb2.aio_nbytes = 512;
写入会报错
Invalid argument (-22)
那该怎么做呢?
【问题讨论】:
-
还要考虑预分配文件,这将有助于提高以后每次访问的性能。
-
我怀疑你最好还是改用
pwrite()或pwritev()。 -
@Shawn 谢谢,但我知道 pwrite 是块 I/O? posix AIO 更好吗?
-
how to download files using linux 这将告诉你如何使用
Wget和rTorrent以及其他一些方法