#include #include #include #include #include #include #include #include #include #include #include #include int main ( int argc, char *argv[] ) { int rshmid, wshmid, *p; int r_mutex, w_mutex, block_read, block_write; if (argc == 1) { fprintf(stderr, "*** Run with command: create or remove\n"); exit(1); } if (!strcmp(argv[1], "create")) { rshmid = shmget(ftok("/home",1), sizeof(int), 0666 | IPC_CREAT | IPC_EXCL); p = (int *)shmat(rshmid, NULL, 0); *p = 0; shmdt(p); wshmid = shmget(ftok("/home",2), sizeof(int), 0666 | IPC_CREAT | IPC_EXCL); p = (int *)shmat(wshmid, NULL, 0); *p = 0; shmdt(p); r_mutex = semget(ftok("/home",3), 1, 0666 | IPC_CREAT | IPC_EXCL); semctl(r_mutex, 0, SETVAL, 1); w_mutex = semget(ftok("/home",4), 1, 0666 | IPC_CREAT | IPC_EXCL); semctl(w_mutex, 0, SETVAL, 1); block_read = semget(ftok("/home",5), 1, 0666 | IPC_CREAT | IPC_EXCL); semctl(block_read, 0, SETVAL, 1); block_write = semget(ftok("/home",6), 1, 0666 | IPC_CREAT | IPC_EXCL); semctl(block_write, 0, SETVAL, 1); } else if (!strcmp(argv[1], "remove")) { rshmid = shmget(ftok("/home",1), sizeof(int), 0666); wshmid = shmget(ftok("/home",2), sizeof(int), 0666); r_mutex = semget(ftok("/home",3), 1, 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); printf("\t\t\tHit return when all readers and writers are gone\n"); while (getchar() != '\n') ; shmctl(rshmid, IPC_RMID, NULL); shmctl(wshmid, IPC_RMID, NULL); semctl(r_mutex, 0, IPC_RMID, 0); semctl(w_mutex, 0, IPC_RMID, 0); semctl(block_read, 0, IPC_RMID, 0); semctl(block_write, 0, IPC_RMID, 0); } exit(0); }