Почему мой ребенок печатает определенную строку из файла только иногда? - PullRequest
0 голосов
/ 01 декабря 2019

Я пытаюсь прочитать определенные строки из файла, используя родительский процесс для чтения одной строки и дочерний процесс для чтения другой строки. В простом текстовом файле содержится следующее: «Это первая строка \ n», Это вторая строка \ n »и т. Д.

Однако я обнаружил, что когда я выполняю свою программу несколько раз, мой ребенок невсегда печатать строку из моего файла. printf («Ввод дочернего \ n») всегда выполняется, что указывает на то, что я могу нормально ввести дочерний процесс.

Почему это работает только иногда?

int main() {
FILE* fptr = fopen("my_text.txt","r");

int stat;
pid_t pid;
int count = 0;
if(fptr != NULL) {
    char line[256];
    fflush(stdout);
    if((pid = fork()) < 0) {
        fprintf(stderr, "fork error: %s\n",strerror(errno));
    }
    else if(pid == 0) {
        printf("entering child\n");
        int lineNumber = 2; // read the second line
        while (fgets(line, sizeof(line), fptr) != NULL) { // loop until we get to desired line
            if (count == lineNumber) {

                printf("CHILD read: %s", line);

                fflush(stdout);
                rewind(fptr);
                break;
            } else {
                count++;
            }
        }
        exit(0); // exit child process

    } else { // parent process

        int lineNumber = 1; 
        while (fgets(line, sizeof(line), fptr) != NULL) { // loop until desired line
            if (count == lineNumber) {
                printf("PARENT read: %s", line);
                fflush(stdout);  
                rewind(fptr);
                break;
            } else {
                count++;
            }
        }
        wait(&stat); // reap the child process
    }
    fclose(fptr);
} else {
    printf("File Does not exist\n");
    exit(0);
}

return 0; }   

Из вышеприведенного кода я иногда печатаю «Это вторая строка» (из родительского) и «Это третья строка» (из дочернего), или иногда только «Это вторая строка». чтобы заставить обоих печатать.

1 Ответ

4 голосов
/ 01 декабря 2019

Два процесса совместно используют описание открытого файла , что означает, что они оба совместно используют смещение файла , и поэтому у вас есть условие гонки , потому что они читаютфайл одновременно . Существует два очевидных способа исправить:

  • использовать какой-либо механизм IPC для синхронизации или описание файла блокировки - см., Например, flock.
  • , откройтефайл в каждый процесс после разветвления.

Другими продвинутыми методами, например, будет чтение файла с pread или mmap до или после разветвления. .

...