#include #include #include #include #include #include #include #include #include #include #include #include int rshmid; int r_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 reader ( int i ) { int *read_count; srand((unsigned int)getpid()); read_count = (int *)shmat(rshmid,NULL,0); P(block_read); P(r_mutex); ++(*read_count); if (*read_count == 1) P(block_write); V(r_mutex); V(block_read); printf("Reader %d going to read: read_count = %d\n", i, *read_count); usleep(1000000 + rand() % 1000001); P(r_mutex); --(*read_count); printf("Reader %d finished reading: read_count = %d\n", i, *read_count); if (*read_count == 0) V(block_write); V(r_mutex); shmdt(read_count); exit(0); } int main ( int argc, char *argv[] ) { int n, i; srand((unsigned int)getpid()); n = (argc > 1) ? atoi(argv[1]) : 64; rshmid = shmget(ftok("/home",1), sizeof(int), 0666); r_mutex = semget(ftok("/home",3), 1, 0666); block_read = semget(ftok("/home",5), 1, 0666); block_write = semget(ftok("/home",6), 1, 0666); for (i=0; i