38 lines
1.7 KiB
C
38 lines
1.7 KiB
C
/**
|
|
* @file supervisor.c
|
|
* @author Ivaylo Ivanov 11777707
|
|
* @date 11.01.2018
|
|
*
|
|
* @brief Supervisor program module.
|
|
*
|
|
* The supervisor sets up the shared memory and the semaphores and initializes the circular buffer required
|
|
* for the communication with the generators. It then waits for the generators to write solutions to the
|
|
* circular buffer.
|
|
* The supervisor program takes no arguments.
|
|
* Once initialization is complete, the supervisor reads the solutions from the circular buffer and remembers the best solution so far, i.e. the solution with the least edges. Every time a better solution than the
|
|
* previous best solution is found, the supervisor writes the new solution to standard output. If a generator
|
|
* writes a solution with 0 edges to the circular buffer, then the graph is acyclic and the supervisor terminates. Otherwise the supervisor keeps reading results from the circular buffer until it receives a SIGINT
|
|
* or a SIGTERM signal.
|
|
* Before terminating, the supervisor notifies all generators that they should terminate as well. This can
|
|
* be done by setting a variable in the shared memory, which is checked by the generator processes before
|
|
* writing to the buffer. The supervisor then unlinks all shared resources and exits.
|
|
*
|
|
* SYNOPSIS
|
|
* supervisor
|
|
*
|
|
**/
|
|
#include "shared/shm.c"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if(argc > 1) {
|
|
fprintf(stderr, "ERROR: Command takes no arguments");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
void* terminate_shm = open_shm(TERMINATE_SHM, TERMINATE_SHM_SIZE);
|
|
|
|
write_to_shm(terminate_shm, "1", TERMINATE_SHM_SIZE);
|
|
close_shm(terminate_shm, TERMINATE_SHM_SIZE);
|
|
destroy_shm(TERMINATE_SHM);
|
|
}
|