pwriteを使用して2GBをファイルに書き込もうとしていますが、 しかし、1GBの2回のpwrite呼び出しを使用して合計2GBを書き込むと、それは機能します。2GBをファイルに書き込もうとしましたが、書き込まれている間違った量が表示されています
予想ファイルサイズ:2147483648バイト(2GB)、観察:2147479552
としてコンパイル:ここでは64ビットのopenSUSE
にgcc -Wall test.c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_XOPEN_SOURCE=600
のgcc V 4.5.0は完全なプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
size_t size = 2147483648; //2GB
off_t offset = 0;
int fd;
char *buf = (char*) malloc (size * sizeof(char));
if(buf == NULL)
{
printf("malloc error \n");
exit(-1);
}
if(-1 == (fd = open("/tmp/test.out", O_RDWR|O_CREAT, 0644)))
{
fprintf(stderr, "Error opening file. Exiting..\n");
free(buf);
exit(-1);
}
if(-1 == (pwrite(fd, buf, size, offset)))
{
perror("pwrite error");
free(buf);
exit(-1);
}
free(buf);
return 0;
}
'pwrite' *がすべてのバイトを書き込んでいないことを知っていますか? – jitihsk
* shrug *。私は知らないが、私は推測できる。おそらく、カーネルコードには、書かれた量が32ビット符号付き整数に収まる必要があります。したがって、((2^31)-1)バイトに制限する必要があります。彼らは任意の制限を課しているので、正確な値はそれほど重要ではないので、(2^31)-4096バイトに制限されます。これは4kBページの整数です。これは仕様で許されており、適切なアプリにはループがあるので、うまくいくでしょう。 (あなたが投稿したおもちゃの例ではなく、適切なアプリケーションでは、信号によっていつでもpwriteが中断する可能性があります。そのため、適切なアプリケーションにはループが必要です)。 – user9876
[あなたのコードを「おもちゃの例」として記述すると、私は無礼を意味するわけではありません。それどころか、おもちゃの例は、Stack Overflowの質問に正確に投稿するのは正しいことです - 誰も質問に答えるために何千もの "適切なアプリ"を歩きたいと思っていません!] – user9876