Semafor卡在文件末尾

时间:2019-05-30 00:07:20

标签: c operating-system

我有来自操作系统的作业。我必须使用semafors编写代码。我们必须从一个文本文件中读取2 Int,并且具有共享内存,这是一个父进程,必须将第一个孩子的第一个孩子和第二个孩子的第二个孩子写入标准输出。我的文件名为“ be.txt”,包含六个数字1 3 1 4 1 5

我已经重写了我的代码,更改了上下结构的值,但是没有任何改变。我每次都得到结果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);
}

0 个答案:

没有答案