Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.02 KB | None | 0 0
  1. /** Karlstad University
  2.  *  Course: Distributed Systems and Applications
  3.  *  Course Code: DVGC15
  4.  *  Authors: Cédric Poirot, Jaume Gelonch, Felix Grund
  5.  *  Contents: Lab 1 : Part 1 : Unnamed Pipes : Token Game
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <signal.h>
  12. #include <errno.h>
  13. #include <stdbool.h>
  14. #include <limits.h>
  15.  
  16. #define CONVERT_FAILURE -1
  17. #define READ_FAILURE -2
  18.  
  19. int tokenvalue;
  20. int players;
  21. int winpoints;
  22.  
  23. void parent_signal_handler(int sig) {
  24.     printf("\nMain process got signal");
  25.     //kill(SIGTERM); HOW DO I KNOW THE PIDs OF THE CHILDREN??
  26.     exit(EXIT_SUCCESS);
  27. }
  28.  
  29. void child_signal_handler(int sig) {
  30.     printf("\nChild process got signal");
  31.     exit(EXIT_SUCCESS);
  32. }
  33.  
  34. void print_header() {
  35.     printf("\n=====================================================");
  36.     printf("\n=========== Welcome to the magnificient =============");
  37.     printf("\n======================= TOKEN =======================");
  38.     printf("\n======================= GAME ========================");
  39.     printf("\n=====================================================\n");
  40. }
  41.  
  42. int read_value() {
  43.     char read[20];
  44.     printf("\n Enter value: ");
  45.     fflush(stdout);
  46.  
  47.     if (fgets(read, sizeof(read), stdin)) {
  48.         int number = CONVERT_FAILURE;
  49.         sscanf(read, "%d", &number);
  50.         return number;
  51.     }
  52.     else {
  53.         return READ_FAILURE;
  54.     }
  55.  
  56. }
  57.  
  58. int get_value() {
  59.     int value;
  60.     while ((value = read_value()) == CONVERT_FAILURE) {
  61.         printf("\nAre you kidding? This is not a number, please do again...");
  62.     }
  63.    
  64.     if (value == READ_FAILURE) {
  65.         perror("\nFailure reading from input. Program exits");
  66.         exit(EXIT_FAILURE);    
  67.     }
  68.     else {
  69.         return value;
  70.     }
  71. }
  72.  
  73. int child_process (int readpipe, int writepipe, int player_number) {
  74.     printf("\nPlayer #%d is alive...", player_number);
  75.     fflush(stdout);
  76.    
  77.     int mypoints = 0;
  78.     int mytoken = INT_MAX;
  79.    
  80.    
  81.     while (mypoints < winpoints) {
  82.  
  83.         read(readpipe, &mytoken, sizeof(mytoken));
  84.         sleep(1);
  85.         printf("\nToken was read by player #%d: %d", player_number, mytoken);
  86.         fflush(stdout);
  87.         if (mytoken > 0) {
  88.             sleep(1);
  89.             printf("\nNo win this time for player #%d. Passing decreased token to next player...", player_number);
  90.             fflush(stdout);
  91.             mytoken--;
  92.             write(writepipe, &mytoken, sizeof(mytoken));
  93.         }
  94.         else {
  95.             sleep(1);
  96.             mypoints++;
  97.             printf("\nPlayer #%d wins! He has now %d winning points! Next round...", player_number, mypoints);
  98.             fflush(stdout);
  99.             mytoken = INT_MAX;
  100.             write(writepipe, &tokenvalue, sizeof(tokenvalue));
  101.         }
  102.     }
  103.    
  104.     printf("Game finished! Player #%d has %d winning points and is the winner.\n***** CONGRATULATIONS *****\n\nProgram exits...", player_number, mypoints);
  105.     kill(getppid(), SIGTERM);
  106. }
  107.  
  108. int run_game() {
  109.     int i;
  110.     int pipes[players][2];
  111.     char buffer[players][30];
  112.     pid_t pid[players];
  113.    
  114.     for (i = 0; i < players; i++) {
  115.        
  116.         if (pipe(pipes[i]) == -1) {
  117.             perror("pipe");
  118.             exit(EXIT_FAILURE);
  119.         }
  120.     }
  121.    
  122.     printf("\nPipes created...");
  123.     fflush(stdout);
  124.    
  125.     for (i = 0; i < players; i++) {
  126.        
  127.         int readpipe, writepipe, pipe_number;
  128.         pipe_number = i;
  129.         writepipe = pipes[pipe_number][1];
  130.        
  131.         pipe_number--;
  132.         if (pipe_number < 0) pipe_number = players-1;
  133.         readpipe = pipes[pipe_number][0];
  134.            
  135.         if ((pid[i] = fork()) == -1) {
  136.             perror("fork");
  137.             exit(EXIT_FAILURE);        
  138.         }
  139.         else if (pid[i] == 0) { // Child
  140.             (void) signal(SIGTERM, child_signal_handler);
  141.             child_process(readpipe, writepipe, i);
  142.             break;
  143.         }
  144.        
  145.         sleep(1);
  146.     }
  147.  
  148.     write(pipes[players-1][1], &tokenvalue, sizeof(tokenvalue));
  149.    
  150.     return 0;
  151. }
  152.  
  153. int main() {
  154.     (void) signal(SIGTERM, parent_signal_handler);
  155.    
  156.     print_header();
  157.  
  158.     fputs("\nPlease Enter Token Value: ", stdout);
  159.     tokenvalue = get_value();
  160.     fputs("\nHow many players?: ", stdout);
  161.     players = get_value();
  162.     fputs("\nHow many winning points?: ", stdout);
  163.     winpoints = get_value();
  164.     printf("\nThe final settings of the game: Token Value = %d, Players = %d, Winpoints = %d", tokenvalue, players, winpoints);
  165.     fflush(stdout);
  166.    
  167.     run_game();
  168.    
  169.     pause();
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement