Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /** Karlstad University
- * Course: Distributed Systems and Applications
- * Course Code: DVGC15
- * Authors: Cédric Poirot, Jaume Gelonch, Felix Grund
- * Contents: Lab 1 : Part 1 : Unnamed Pipes : Token Game
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <signal.h>
- #include <errno.h>
- #include <stdbool.h>
- #include <limits.h>
- #define CONVERT_FAILURE -1
- #define READ_FAILURE -2
- int tokenvalue;
- int players;
- int winpoints;
- void parent_signal_handler(int sig) {
- printf("\nMain process got signal");
- //kill(SIGTERM); HOW DO I KNOW THE PIDs OF THE CHILDREN??
- exit(EXIT_SUCCESS);
- }
- void child_signal_handler(int sig) {
- printf("\nChild process got signal");
- exit(EXIT_SUCCESS);
- }
- void print_header() {
- printf("\n=====================================================");
- printf("\n=========== Welcome to the magnificient =============");
- printf("\n======================= TOKEN =======================");
- printf("\n======================= GAME ========================");
- printf("\n=====================================================\n");
- }
- int read_value() {
- char read[20];
- printf("\n Enter value: ");
- fflush(stdout);
- if (fgets(read, sizeof(read), stdin)) {
- int number = CONVERT_FAILURE;
- sscanf(read, "%d", &number);
- return number;
- }
- else {
- return READ_FAILURE;
- }
- }
- int get_value() {
- int value;
- while ((value = read_value()) == CONVERT_FAILURE) {
- printf("\nAre you kidding? This is not a number, please do again...");
- }
- if (value == READ_FAILURE) {
- perror("\nFailure reading from input. Program exits");
- exit(EXIT_FAILURE);
- }
- else {
- return value;
- }
- }
- int child_process (int readpipe, int writepipe, int player_number) {
- printf("\nPlayer #%d is alive...", player_number);
- fflush(stdout);
- int mypoints = 0;
- int mytoken = INT_MAX;
- while (mypoints < winpoints) {
- read(readpipe, &mytoken, sizeof(mytoken));
- sleep(1);
- printf("\nToken was read by player #%d: %d", player_number, mytoken);
- fflush(stdout);
- if (mytoken > 0) {
- sleep(1);
- printf("\nNo win this time for player #%d. Passing decreased token to next player...", player_number);
- fflush(stdout);
- mytoken--;
- write(writepipe, &mytoken, sizeof(mytoken));
- }
- else {
- sleep(1);
- mypoints++;
- printf("\nPlayer #%d wins! He has now %d winning points! Next round...", player_number, mypoints);
- fflush(stdout);
- mytoken = INT_MAX;
- write(writepipe, &tokenvalue, sizeof(tokenvalue));
- }
- }
- printf("Game finished! Player #%d has %d winning points and is the winner.\n***** CONGRATULATIONS *****\n\nProgram exits...", player_number, mypoints);
- kill(getppid(), SIGTERM);
- }
- int run_game() {
- int i;
- int pipes[players][2];
- char buffer[players][30];
- pid_t pid[players];
- for (i = 0; i < players; i++) {
- if (pipe(pipes[i]) == -1) {
- perror("pipe");
- exit(EXIT_FAILURE);
- }
- }
- printf("\nPipes created...");
- fflush(stdout);
- for (i = 0; i < players; i++) {
- int readpipe, writepipe, pipe_number;
- pipe_number = i;
- writepipe = pipes[pipe_number][1];
- pipe_number--;
- if (pipe_number < 0) pipe_number = players-1;
- readpipe = pipes[pipe_number][0];
- if ((pid[i] = fork()) == -1) {
- perror("fork");
- exit(EXIT_FAILURE);
- }
- else if (pid[i] == 0) { // Child
- (void) signal(SIGTERM, child_signal_handler);
- child_process(readpipe, writepipe, i);
- break;
- }
- sleep(1);
- }
- write(pipes[players-1][1], &tokenvalue, sizeof(tokenvalue));
- return 0;
- }
- int main() {
- (void) signal(SIGTERM, parent_signal_handler);
- print_header();
- fputs("\nPlease Enter Token Value: ", stdout);
- tokenvalue = get_value();
- fputs("\nHow many players?: ", stdout);
- players = get_value();
- fputs("\nHow many winning points?: ", stdout);
- winpoints = get_value();
- printf("\nThe final settings of the game: Token Value = %d, Players = %d, Winpoints = %d", tokenvalue, players, winpoints);
- fflush(stdout);
- run_game();
- pause();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement