-1

POSIX準拠のCで記述されたコードがありますが、正しく機能していないようです。目標は、Linux / BSD/Darwinカーネルの乱数ジェネレーターへのインターフェイスである/dev/ randomから読み取り、書き込まれたバイトをファイルに出力することです。私はすべての地面をカバーしたと確信しているので、私が見落としているものがよくわかりません。とにかく、ここにあります:

int incinerate(int number, const char * names[]) {
if (number == 0) {
    // this shouldn't happen, but if it does, print an error message
    fprintf(stderr, "Incinerator: no input files\n");
    return 1;
}

// declare some stuff we'll be using
long long lengthOfFile = 0, bytesRead = 0;
int myRandomInteger;

// open the random file block device
int zeroPoint = open("/dev/random", O_RDONLY);

// start looping through and nuking files
for (int i = 1; i < number; i++) {
    int filePoint = open(names[i], O_WRONLY);

    // get the file size
    struct stat st;
    stat(names[i], &st);
    lengthOfFile = st.st_size;
    printf("The size of the file is %llu bytes.\n", lengthOfFile);

    while (lengthOfFile != bytesRead) {
        read(zeroPoint, &myRandomInteger, sizeof myRandomInteger);
        write(filePoint, (const void*) myRandomInteger, sizeof(myRandomInteger));
        bytesRead++;
    }

    close(filePoint);
}

return 0;
}

何か案は?これはOSXで開発されていますが、LinuxやFreeBSDでも動作しない理由はわかりません。

それが役立つ場合は、次のヘッダーを含めました。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
4

1 に答える 1

4

それ以外の

write(filePoint, (const void*) myRandomInteger, sizeof(myRandomInteger));

あなたは確かに書くつもりだった

write(filePoint, (const void*) &myRandomInteger, sizeof(myRandomInteger));

そうでしたか?読み取ったランダムなバイトを/dev/randomポインターとして使用すると、遅かれ早かれセグメンテーション違反が発生することはほぼ確実です。

于 2012-11-06T21:39:31.910 に答える