|
#include "svshm.h"
|
#include "squeue.h"
|
|
using namespace std;
|
|
SQueue<struct Item> *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<struct Item>), &shmp);
|
|
if (first == 1)
|
queue = new(shmp) SQueue<struct Item>;
|
else
|
queue = (SQueue<struct Item> *) 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);
|
}
|