0

I am working on reader-writer problem. Algorithm wise, i believe the solution is ok. The only problem that I am facing is opening multiple readers/writer windows using xterm. When I run the program it goes into an infinite loop and it crashed the whole system. It also open multiple xterm windows. It might be silly and simple, but I just don't seem to be able to figure out why? I've been thinking about this since yesterday. How do i fix this problem? The suspected area of conflict is highlighted with ** comments...

#include <unistd.h>     /* Symbolic Constants */
#include <sys/types.h>  /* Primitive System Data Types */ 
#include <errno.h>      /* Errors */
#include <stdio.h>      /* Input/Output */
#include <stdlib.h>     /* General Utilities */
#include <pthread.h>    /* POSIX Threads */
#include <string.h>     /* String handling */
#include <semaphore.h>  /* Semaphore */


//Global Variablels
int rc = 0;
int wc = 0;

sem_t m1, m2, m3, w, r; //Semphore


int reader() {
sem_wait(&m3);
sem_wait(&r);
sem_wait(&m1);
rc++;
if(rc == 1) sem_wait(&w);
sem_post(&m1);
sem_post(&r);
sem_post(&m3);
system("xterm -e ./read");
//execlp("xterm", "-e", "./ahor2r", NULL);
sem_wait(&m1);
rc--;
if(rc == 0) sem_post(&w);
sem_post(&m1);
return 0;
}



int writer() {
    sem_wait(&m2);
    wc++;
    if(wc == 1) sem_wait(&r);    
    sem_post(&m2); 
    sem_wait(&w);
    //system("xterm -e ./write"); //writing is performed
    execlp("xterm", "-e", "./ahor2w", NULL);    
    sem_post(&w);
    sem_wait(&m2);
    wc--;
    if(wc == 0)  sem_post(&r);
    sem_post(&m2);
    return 0;
}



int main() {
int ch;
sem_init(&m1, 0, 1); 
sem_init(&m2, 0, 1); 
sem_init(&m3, 0, 1); 
sem_init(&w, 0, 1); 
sem_init(&r, 0, 1); 
/*****************************************************************************
**********infinite loop*******************************************************/
while(1) {
    printf("\n\nEnter your option\n\n1> Create Reader\n2> Create Writer\n 3> Exit\n\t");
    scanf("%d", &ch);
    if(ch == 1)
        switch(fork()) {
        case -1:
            perror("Cannot fork a new reader process\n");
        break;
    case 0:
        reader();
    }
else if (ch == 2) 
    switch(fork()) {
    case -1:
            perror("Cannot fork a new reader process\n");
            break;
    case 0:
        writer();
    }
else if (ch == 3) {
    sem_destroy(&m1);
    sem_destroy(&m2);
    sem_destroy(&m3);
    sem_destroy(&w); 
    sem_destroy(&r); 
    return 0;
    }
else printf("INVALID OPTION - no action taken\n");
}
/*****************************************************************************
*****************************************************************************/
return 0;
}
Ahor Converse
  • 113
  • 1
  • 6
  • 14

1 Answers1

0

You have two big errors:

  1. You don't create your semaphores in shared memory. So each process gets its own copy of the semaphores, which makes no sense.

  2. You don't create process-shared semaphores. The 0 in sem_init means that the semaphores will not be shared between processes. But fork creates new processes.

If pshared has the value 0, then the semaphore is shared between the threads of a process[.] If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory (see shm_open(3), mmap(2), and shmget(2)).

David Schwartz
  • 179,497
  • 17
  • 214
  • 278