2012-02-22 17 views
2

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; 
} 

答えて

5

説明

PWRITEは() にBUFから始まるオフセットオフセットでファイルディスクリプタfdをバッファから最大countバイトを書き込みます。ファイルオフセットが に変更されていません。成功し

戻り値

、書き込まれたバイト数が返される(ゼロ 何も書き込まれなかったことを示す)、エラーの場合は-1、ケースerrnoにエラーを示す 設定されます。

pwrite()が要求したバイト数を書き込む必要はありません。書き込む回数が少なくて済み、これはエラーではありません。通常、pwrite()をループで呼び出すと、すべてのデータを書き込んでいない場合、またはerrno == EINTRで失敗した場合は、もう一度呼び出して残りのデータを書き出します。

+0

'pwrite' *がすべてのバイトを書き込んでいないことを知っていますか? – jitihsk

+2

* shrug *。私は知らないが、私は推測できる。おそらく、カーネルコードには、書かれた量が32ビット符号付き整数に収まる必要があります。したがって、((2^31)-1)バイトに制限する必要があります。彼らは任意の制限を課しているので、正確な値はそれほど重要ではないので、(2^31)-4096バイトに制限されます。これは4kBページの整数です。これは仕様で許されており、適切なアプリにはループがあるので、うまくいくでしょう。 (あなたが投稿したおもちゃの例ではなく、適切なアプリケーションでは、信号によっていつでもpwriteが中断する可能性があります。そのため、適切なアプリケーションにはループが必要です)。 – user9876

+1

[あなたのコードを「おもちゃの例」として記述すると、私は無礼を意味するわけではありません。それどころか、おもちゃの例は、Stack Overflowの質問に正確に投稿するのは正しいことです - 誰も質問に答えるために何千もの "適切なアプリ"を歩きたいと思っていません!] – user9876

2

私はあなただけチェックしてはならないと思いますpwrite -1を返すだけでなく、実際に書き込まれたバイト数であり、書き込まれたバイト数は、あなたが書きたい未満の場合はケースを処理するものかどうか。詳細は、the pwrite manpageを参照してください。 PWRITE manページから

関連する問題