#include "svshm.h" #include "squeue.h" using namespace std; SQueue *queue; void sigint_handler(int sig) { queue->~SQueue(); mm_deinit(); exit(0); } int main(int argc, char *argv[]) { int semid; //struct shmseg *shmp; union semun dummy; void *shmp; string line; signal(SIGINT, sigint_handler); /* Create set containing two semaphores; initialize so that writer has first access to shared memory. */ semid = semget(SEM_KEY, 2, IPC_CREAT | OBJ_PERMS); if (semid == -1) err_exit(errno, "semget"); if (initSemAvailable(semid, WRITE_SEM) == -1) err_exit(errno, "initSemAvailable"); if (initSemInUse(semid, READ_SEM) == -1) err_exit(errno, "initSemInUse"); int first = mm_init(sizeof(SQueue), &shmp); if (first == 1) queue = new(shmp) SQueue; else queue = (SQueue *) shmp; /* Transfer blocks of data from stdin to shared memory */ struct Item item; cout << "请输入两个数字,中间以空格分隔:" ; while(scanf("%d %d", &item.pic, &item.info)) { //fprintf(stderr, "push %d\n", line); if (reserveSem(semid, WRITE_SEM) == -1) err_exit(errno, "reservesem"); queue->enqueue(item); if (releaseSem(semid, READ_SEM) == -1) err_exit(errno, "releasesem"); cout << "请输入两个数字,中间以空格分隔:" ; } /* Wait until reader has let us have one more turn. We then know reader has finished, and so we can delete the IPC objects. */ if (reserveSem(semid, WRITE_SEM) == -1) err_exit(errno, "reserveSem"); if (semctl(semid, 0, IPC_RMID, dummy) == -1) err_exit(errno, "semctl"); queue->~SQueue(); mm_deinit(); exit(EXIT_SUCCESS); }