Semafor застрял в конце файла - PullRequest
0 голосов
/ 30 мая 2019

У меня домашнее задание из операционных систем. Я должен написать код, в котором мы должны использовать semafors. Есть процесс отца, в котором мы должны прочитать 2 Int из текстового файла, и с общей памятью должны записать в стандартный вывод первый дочерний элемент, а второй дочерний элемент - второе число. Мой файл называется "be.txt" и содержит шесть цифр 1 3 1 4 1 5

Я переписал свой код, изменил значения структур down и up, но ничего не изменилось. Я получаю каждый раз как результат 1 1 3 4 ... и вот программа просто застряла и ждет.

Ps .: myinclude.h - мой заголовок, в котором я определил функцию syserr и библиотеку, в которой он мне нужен для кода.

#include "myinclude.h"

void fiufeladat(int semid, int * ip, short sem){
    struct sembuf down = {sem, -1, 0};
    struct sembuf up = {0, +1, 0};

    int n;

    while(1){
        if(semop(semid, &down, 1)<0){
            syserr("semop fiu feladat");
        }
        n = *ip;

        if(semop(semid, &up, 1)<0) syserr("semop fiu feladat");
        if(n == 0) break;
        printf("%d ", n);
    }
    shmdt((void*)ip);

}

int main(){
    int semid, shmid;
    int * ip;
    int init[]={2,0,0};
    int n,m;

    pid_t fiu1, fiu2;

    struct sembuf down0 = {0, -2, 0};
    struct sembuf up[] = {{1, +1, 0}, {2, +1, 0}};

    setbuf(stdout, NULL);

    if((semid = semget(ftok(".", 'a'), 3, IPC_CREAT | 0660 )) < 0) syserr("semget");
    if((shmid = shmget(ftok(".", 'a'), 2*sizeof(int), IPC_CREAT| 0660))<0) syserr("shmget");
    if(semctl(semid, 0, SETALL, init)<0) syserr("semctl");

    ip = (int*)shmat(shmid, 0, 0);
    if(ip == (void*)-1) syserr("shmat");

    FILE * fp = fopen("be.txt", "r");
    if(!fp) syserr("fopen");

    if((fiu1 = fork()) < 0) syserr("fork fiu1");
    if(fiu1 == 0){
        fiufeladat(semid, ip, 1);
        exit(0);
    }

    if((fiu2 = fork())<0) syserr("fork fiu2");
    if(fiu2 == 0){
        fiufeladat(semid, ip+1, 2);
        exit(0);
    }

    while(1){
        if(fscanf(fp, "%d %d", &n, &m) == EOF) {
            *ip = 0;
            *(ip+1) = 0;
        }
        if(semop(semid, &down0, 1) < 0) syserr("semop apa down0");
        *ip = n;
        *(ip+1) = m;
        //printf("%d %d", n,m);
        if(semop(semid, up, 2)<0){
            syserr("semop apa fel");
        }
        if(*ip == 0 && *(ip+1) == 0) break;
    }



    semctl(semid, 0, IPC_RMID, 0);
    shmdt((void*)ip);
    shmctl(shmid, IPC_RMID, 0);
    fclose(fp);
    exit(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...