/** * @file supervisor.c * @date 2018-05-21 * * @brief Server program which reads solutions and orders them. */ #include "common.h" static const char *pname; struct circ_buf *shared; struct sigaction sa; static volatile sig_atomic_t quit = 0; static void sig_handler(int signum) { quit = 1; } void usage(void) { fprintf(stderr, "SYNOPSIS\n" "\tsupervisor\n"); exit(EXIT_FAILURE); } void initCircBuf() { shared->quit = 0; for (int i = 0; i < MAX_ITEMS; i++) { shared->data[i] = 0; } return; } int getSolution(sem_t sUsedSpace, sem_t sFreeSpace, int *solution) { sem_wait(&sUsedSpace); int value; value = shared->data[shared->head]; shared->head = (shared->head + 1) % MAX_ITEMS; sem_post(&sFreeSpace); return value; } int main(int argc, char *argv[]) { if (argc != 1) usage(); pname = argv[0]; struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = &sig_handler; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); int shmfd = shm_open(SHM_NAME, O_RDWR | O_CREAT, PERMISSION); if (shmfd == -1) { perror(pname); exit(EXIT_FAILURE); } if (ftruncate(shmfd, sizeof(*shared)) == -1) { perror(pname); exit(EXIT_FAILURE); } shared = mmap(NULL, sizeof(*shared), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0); if (shared == MAP_FAILED) { perror(pname); exit(EXIT_FAILURE); } sem_t *sFreeSpace = sem_open(SEM_FREE_SPACE, O_CREAT | O_EXCL, PERMISSION, MAX_ITEMS); sem_t *sUsedSpace = sem_open(SEM_USED_SPACE, O_CREAT | O_EXCL, PERMISSION, 0); initCircBuf(); while (quit == 0) { int solution[MAX_ITEMS] = {-1}; getSolution(*sUsedSpace, *sFreeSpace, solution); } return 0; }