0

基本的に私がやろうとしているのは、ファイルから数値を読み取り、値を1つ増やしてから、その数値を同じファイルに書き戻すことです。fork() を使用すると、両方のプロセスがファイルにアクセスすることになっていますが、ロックを使用しているため、順番に処理されます。セグメンテーション違反が発生し続けます。

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

void appendValue(FILE *, int *);
int readValue(FILE *, int *);
void lockFile(FILE *);
void unlockFile(FILE *);
void whatProcess(pid_t *pID);

int main(void) {
    pid_t pID;
    pID = fork();
    int value = 0, counter = 0;
    int *valPtr = &value;
    pid_t *pidPtr = &pID;
    FILE *file = fopen("output.txt", "a+");
    lockFile(file);

    while(counter < 1000) {
        whatProcess(pidPtr);
        value = readValue(file, valPtr);
        value++;
        appendValue(file, valPtr);
        rewind(file);
        counter++;
    }
    unlockFile(file);       
    fclose(file);
    printf("\n");
    return 0;
}

void whatProcess(pid_t *pID) {
    if(*pID > 0) {
        printf("\n --- In Parent ---");
    } else if(*pID == 0) {
        printf("\n --- In Child ---");
    } else {
            printf("\n --- fork() Failed ---");
    }
}

void lockFile(FILE *file) {
    int lock;
    lock = lockf(fileno(file), F_LOCK, 0);
        while(lock != 0) {}
        if(lock == 0) {
            printf("\nPID %d: Lock Successful", getpid());
        } else {
            printf("\nPID %d: Lock Unsuccessful", getpid());
        }   
}

void unlockFile(FILE *file) {
    int lock;
    lock = lockf(fileno(file), F_LOCK, 0);
        while(lock != 0) {}
        if(lock == 0) {
            printf("\nPID %d: Unlock Successful", getpid());
        } else {
            printf("\nPID %d: Unlock Unsuccessful", getpid());
        }   
}

void appendValue(FILE *file, int *value) {
    fprintf(file, "%d\n", *value);
}

int readValue(FILE *file, int *value) {
    while(!feof(file)) {
        fscanf(file, "%d", value);
    }
    return *value;
}
4

1 に答える 1

2

fscanfinreadValueは、割り当てられていない場所への書き込みです。ポインタとして渡すvalueので、演算子のアドレスを使用する必要はありません。

int readValue(FILE *file, int *value) {
    fscanf(file, "%d", value);
    printf("\nreadValue(): %d", *value);
    return *value;
}

または、さらに良い:

int readValue(FILE *file, int *value) {
    if (fscanf(file, "%d", value) == 1) {
        printf("\nreadValue(): %d", *value);
        return 0;
    }
    return -1;
}

現在の関数は、成功したか失敗したかを示していません。ステータスの戻り値を追加するか (ゼロ、-1 はかなり一般的です)、エラー チェックを省略して、代わりに次のようにします。

int readValue(FILE *file) {
    int buf;
    if (fscanf(file, "%d", &buf) == 1) {
        printf("\nreadValue(): %d", buf);
    } else {
        perror("readValue(): fscanf failed");
    }
    return buf; /* could be a garbage value, use at own risk */
}
于 2012-07-23T13:13:17.700 に答える