int TaskQueue::AddTask(Task& task) { // TODO: 完成代码 // link share memory to local process virtual memory if (shmptr == (void *)-1) { shmptr = shmat(shmid, 0, 0); if (shmptr == (void *)-1) { cout << "share memory add task error" << endl; return -1; } } else if (task.GetSize() != taskSize) { cout << "TaskQueue add a task of invalid type" << endl; return -1; } return AddTaskInShm(&task); }
TaskQueue::TaskQueue(Task& taskType) : taskMaxNum(TASKMAXNUM) { taskSize = taskType.GetSize(); //create share memory start size_t info_size = sizeof(int) * 2; size_t total_size = info_size + taskSize * taskMaxNum; shmid = shmget(IPC_PRIVATE, total_size, 0600 | IPC_CREAT | IPC_EXCL); if (shmid < 0) { cout << "task queue share memory create id failed" << endl; exit(1); } else if ((shmptr = shmat(shmid, 0, 0)) == (void *)-1) { cout << "task queue init share memory error in linking to share memory" << endl; exit(1); } else { memset(shmptr, 0, info_size); if (shmdt(shmptr) != 0) { cout << "task queue init share memory err in deleting the link " << "to share memory" << endl; exit(1); } } shmptr = (void *)-1; //create share memory end //semaphore init start if ((semid = semget(IPC_PRIVATE, 2, 0600 | IPC_CREAT | IPC_EXCL)) == -1) { cout << "task queue semaphore semget error" << endl; exit(1); } unsigned short semval[2] = {1, 0}; if (semctl(semid, 0, SETALL, semval) == -1) { cout << "task queue semaphore val init error" << endl; exit(1); } }