0

を使用する C プロセスに LFS を追加する必要がありますfseek()。gcc と glibc は、それぞれバージョン 3.2.3 と 2.5 です。

次の変更を行いました。

  1. メイクファイルに追加されCFLAGS += -D_FILE_OFFSET_BITS=64ました。
  2. への呼び出しをへの呼び出しに置き換えましたfseek()( fseeko()MSVC6 のサポートも必要ですが、一度に 1 ステップずつ)。
  3. 2 番目の引数の型を に変更しましたoff_tsizeof()変数では 8 が返されます。

main()これは、DLP とその出力を超えることができるのと同じくらい良いサンプルです。

fd = fopen("large_file", "rb");
off_t offset = 1ULL << 32;
rc = fseeko(fd, offset, SEEK_SET);

rc = -1 sizeof(offset)=8 errno=22 offset=2147483648

4

2 に答える 2

1

あなたの1 << 32例では未定義の動作です。0 または 1 を返す可能性があります。シフトする前に、必ず 1 を適切な型に変換してください。unsigned long32 ビットもある場合は1UL << 32、同じように間違っています。

-D_LARGEFILE64_SOURCEとは避けてくださいoff64_t。物事が複雑になるだけです。代わりに、64 ビットにする必要があるものだけ-D_FILE_OFFSET_BITS=64を使用してください。off_t

于 2015-01-18T14:35:30.813 に答える
0

ここで動作するようにコンパイルされた以下のプログラム CFLAGS = -g2 -Wall -D_LARGEFILE64_SOURCE(3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux)

(とコンパイルしてCFLAGS = -g2 -Wall -D_FILE_OFFSET_BITS=64s/off64_t/off_t/同様にうまく動作します)

#include <stdio.h>
#include <strings.h>
#include <unistd.h>

int main(void)
{
off64_t offset ;
int rc;
FILE *fp;

fp = fopen("testfile", "r+b");
if (!fp) {
        perror("fopen" );
        return 1;
        }

offset = 1ull << 32;
rc = fseeko(fp, offset, 0);
if (rc < 0) {
        perror("fseeko" );
        return 2;
        }
rc = fwrite( "OMG!", 4, 1, fp);
fprintf(stderr,"Write(4) : %d\n", rc);

fclose(fp);

return 0;
}
于 2015-01-18T14:36:57.060 に答える