#include #include #include #include #include #include #include #include #include #include #include #include int wshmid; int w_mutex, block_read, block_write; void P ( int s ) { struct sembuf b; b.sem_num = 0; b.sem_flg = 0; b.sem_op = -1; semop(s, &b, 1); } void V ( int s ) { struct sembuf b; b.sem_num = 0; b.sem_flg = 0; b.sem_op = 1; semop(s, &b, 1); } void writer ( int i ) { int *write_count; srand((unsigned int)getpid()); printf("Writer %d appears\n", i); write_count = (int *)shmat(wshmid,NULL,0); P(w_mutex); ++(*write_count); if (*write_count == 1) P(block_read); V(w_mutex); P(block_write); printf("Writer %d going to write: write_count = %d\n", i, *write_count); usleep(500000 + rand() % 500001); V(block_write); P(w_mutex); --(*write_count); printf("Writer %d finished writing: write_count = %d\n", i, *write_count); if (*write_count == 0) V(block_read); V(w_mutex); shmdt(write_count); exit(0); } int main ( int argc, char *argv[] ) { int n, i; srand((unsigned int)getpid()); n = (argc > 1) ? atoi(argv[1]) : 16; wshmid = shmget(ftok("/home",2), sizeof(int), 0666); w_mutex = semget(ftok("/home",4), 1, 0666); block_read = semget(ftok("/home",5), 1, 0666); block_write = semget(ftok("/home",6), 1, 0666); for (i=0; i