【问题标题】:semop : Bad file descriptorsemop : 错误的文件描述符
【发布时间】:2015-05-25 16:10:40
【问题描述】:
#define MAX 2

int main(){

    int mutex = semget(ftok("/usr",'P'),1,IPC_CREAT|0666);
    int wrt = semget(ftok("/usr",'Q'),1,IPC_CREAT|0666);

    if(mutex <= 0) perror("mutex");
    if(wrt <= 0) perror("wrt");

    if(semctl(mutex,0,SETVAL,1) <= 0) perror("mutex semctl");
    if(semctl(wrt,0,SETVAL,1) <= 0) perror("wrt semctl");

    struct sembuf sops;
    int pid1,pid2,readcount = 0,var=0;
    FILE* fp = fopen("buffer.txt","w");
    fprintf(fp,"%d",var);   
    fclose(fp);
    printf("File created. VAR is %d\n",var);
    pid1 = fork();

   if(!pid1){

        while(1){
            sleep(1);
            sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
        semop(mutex,&sops,1);

        // if(readcount == 0)
        if(readcount == 0){
            //  wait(wrt)
            sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
            if(semop(wrt,&sops,1) <= 0) perror("wrt in reader 1");
        }
        // readcount++
        readcount++;
        // signal(mutex)
        sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
        semop(mutex,&sops,1);

        // read()
        sleep(1.5);
        printf("First reader enters \n");
        fp = fopen("buffer.txt","r");
        fscanf(fp,"%d",&var);
        printf("Reader (%d) reads the value %d\n",getpid(),var);
        fclose(fp);
        printf("First reader leaves\n");
        sleep(1.5);


        // wait(mutex)
        sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
        semop(mutex,&sops,1);
        // readcount--;
        readcount--;
        // if(readcount == 0)
        if(readcount == 0){
            //  signal(wrt)
            sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
            semop(wrt,&sops,1);
        }
        // signal(mutex)
        sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
        semop(mutex,&sops,1);   
    }


}
else{
    pid2 = fork();
    if(!pid2){

        while(1){
            sleep(1);
            // wait(mutex)
            sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
            semop(mutex,&sops,1);
            // if(readcount == 0)
            if(readcount == 0){
                //  wait(wrt)
                sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
                if(semop(wrt,&sops,1) <= 0) perror("wrt in reader 1");
            }
            // readcount++
            readcount++;
            // signal(mutex)
            sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
            semop(mutex,&sops,1);


            // read()
            sleep(1);
            printf("Second reader enters\n");
            sleep(1);
            fp = fopen("buffer.txt","r");
            fscanf(fp,"%d",&var);
            printf("Reader (%d) reads the value %d\n",getpid(),var);
            sleep(1);
            fclose(fp);
            printf("Second reader leaves\n");
            sleep(1);


            // wait(mutex)
            sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
            semop(mutex,&sops,1);
            // readcount--;
            readcount--;
            // if(readcount == 0)
            if(readcount == 0){
                //  signal(wrt)
                sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
                semop(wrt,&sops,1);
            }
            // signal(mutex)
            sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
            semop(mutex,&sops,1);
        }
    }
    else{
        //struct sembuf sop;

        while(1){

            // wait(wrt)
            sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0;
            semop(wrt,&sops,1);

            // write
            sleep(1);
            //printf("%d Writer enters\n",time(0)%100); 
            fp = fopen("buffer.txt","w");
            fscanf(fp,"%d",&var);
            var++;
            sleep(1);
            printf("Writer (%d) writes the value %d\n",getpid(),var);
            fprintf(fp,"%d",&var);
            fclose(fp);
            sleep(1);
            printf("Writer leaves wrt %d\n",semctl(wrt,0,GETVAL,0));

            // signal(wrt)
            sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0;
            printf("wrt just before semop %d and op is %d\n",semctl(wrt,0,GETVAL,0),sops.sem_op);
            if(semop(wrt,&sops,1) <= 0) perror("wrt signal");
            printf("wrt %d\n",semctl(wrt,0,GETVAL,0));
        }
    }

}
}

以下代码是读者-作者问题的轻微变化。在这个程序中,我尝试创建两个子进程(两个读者)。有一个父进程(作者)。读取器只是从名为 buffer.txt 的文件中读取值,而写入器在该文件中写入值。

但在编写器代码中,使用semop()// signal(wrt) 代码出现错误Bad File descriptor。因此,wrt 的值不会增加。请帮忙。

【问题讨论】:

    标签: c file operating-system ipc semaphore


    【解决方案1】:

    经过 10 个小时的长期艰辛,我想出了一个完美运行且没有任何错误死锁的解决方案。

    更改 1: 在 writer 代码中,首先以读取模式打开文件,读取值,然后以写入模式打开文件,然后写入递​​增的值。

    这还不够,可能还会出现死锁问题。

    更改 2: 我们还需要为 readcount 创建一个信号量,因为它们必须由两个子进程使用。

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2015-05-20
      • 1970-01-01
      相关资源
      最近更新 更多