Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.14 KB | None | 0 0
  1. //File: controller.c
  2. //Robert Entenmann
  3. //CSCI311
  4. //Project 6
  5.  
  6. #include "player.h"
  7. static int i = 0;
  8. //usr1 handler
  9. void usr1Handler (int sig)
  10. {
  11.     i++;
  12.     printf("Controller: received ready, total = %d\n", i);
  13. }
  14.  
  15. int main(int argc, char **argv)
  16. {
  17.     //making variables
  18.     int fromP0[2], fromP1[2];
  19.     int p0, p1, err, games;
  20.     int p0Win = 0, p1Win = 0, draw = 0;
  21.     char par[10], inP0[100], inP1[100], ppidS[20];
  22.     pid_t cpid0, cpid1, ppid;
  23.  
  24.     /*Checks for correct number of arguments*/
  25.     if ((argc != 2) || ((games = atoi(argv[1])) <= 0))
  26.     {
  27.       fprintf(stderr,"Usage: %s games\n", argv[0]);
  28.       exit(1);
  29.     }
  30.  
  31.     //creating sigaction USR1
  32.     struct sigaction usr1_act;
  33.     /* Set signal handler. */
  34.     usr1_act.sa_handler = (void(*)(int))usr1Handler;
  35.     sigemptyset(&usr1_act.sa_mask);
  36.     usr1_act.sa_flags = 0;
  37.     err = sigaction (SIGUSR1, &usr1_act, NULL);
  38.  
  39.     //error on sigaction
  40.     if (err == -1)
  41.     {
  42.         printf ("CSIG1: Received error %d on sigaction.\n", errno);
  43.         exit(4);
  44.     }
  45.  
  46.     //creating pipes for player 0
  47.     ppid = getpid();
  48.     sprintf(ppidS, "%d", ppid);
  49.  
  50.     //error with piping for player 0 and 1
  51.     if(pipe(fromP0) == -1)
  52.     {
  53.         printf("Error on pipe creation. Exiting...");
  54.         exit(1);
  55.     }
  56.  
  57.     if(pipe(fromP1) == -1)
  58.     {
  59.         printf("Error on pipe creation. Exiting...");
  60.         exit(1);
  61.     }
  62.  
  63.     //creating player 0
  64.     cpid0 = fork();
  65.  
  66.     //error with creating
  67.     if(cpid0 < 0)
  68.     {
  69.         printf("Error in forking. Exiting...");
  70.         exit(1);
  71.     }
  72.  
  73.     if(cpid0 == 0)
  74.     {
  75.         //setting pipes to player 0
  76.         sprintf(par, "%d", fromP0[1]);
  77.         close(fromP0[0]);
  78.         err = execl("./player", "Player 0", par, ppidS, NULL);
  79.         printf("err %d, errno %d\n", err, errno);
  80.     }
  81.     // add wait to prevent having same srand value
  82.     pause();
  83.     sleep(1);
  84.  
  85.     //creating player 0
  86.     cpid1 = fork();
  87.  
  88.     //error with creating
  89.     if(cpid1 < 0)
  90.     {
  91.         printf("Error in forking. Exiting...");
  92.         exit(1);
  93.     }
  94.  
  95.     if(cpid1 == 0)
  96.     {
  97.         //setting pipes to player 1
  98.         sprintf(par, "%d", fromP1[1]);
  99.         close(fromP1[0]);
  100.         execl("./player", "Player 1", par, ppidS, NULL);
  101.     }
  102.    
  103.     //pause for ready signals
  104.     pause();
  105.     printf("Controller: all players are ready.\n\n");
  106.  
  107.     //flag for # of games
  108.     for(int i = 1; i <= games; i++)
  109.     {
  110.         //signal to players to message pick
  111.         err = kill(cpid0, SIGUSR1);
  112.         printf("Controller: Sending show command to Player 0\n");
  113.         sleep(1);
  114.         err = kill(cpid1, SIGUSR1);
  115.         printf("Controller: Sending show command to Player 1\n");
  116.         sleep(1);
  117.        
  118.         //read pick from pipe for both players
  119.         read(fromP0[0], inP0, 100);
  120.         read(fromP1[0], inP1, 100);
  121.  
  122.         //getting pick as int
  123.         p0 = atoi(inP0);
  124.         p1 = atoi(inP1);
  125.  
  126.         //function to pick what pick based on integer value
  127.         pickHand(p0, p1, i);
  128.         sleep(1);
  129.  
  130.         //compare response and decide winner
  131.         //player 1 wins
  132.         if ((p0 == 0 && p1 == 1) || (p0 == 1 && p1 == 2) || (p0 == 2 && p1 == 0))
  133.         {
  134.             printf("Controller: Round %d: player 1 wins\n\n", i);
  135.             p1Win++;
  136.         }
  137.  
  138.         //player 0 wins
  139.         else if ((p0 == 2 && p1 == 1) || (p0 == 1 && p1 == 0) || (p0 == 0 && p1 == 2))
  140.         {
  141.             printf("Controller: Round %d: player 0 wins\n\n", i);
  142.             p0Win++;
  143.         }
  144.  
  145.         //draw
  146.         else
  147.         {
  148.             printf("Controller: Round %d: Draw\n\n", i);
  149.             draw++;
  150.         }
  151.  
  152.         sleep(1);
  153.     }
  154.  
  155.     //done signal sent from contorller to both players using SIGUSR2
  156.     //signal saying player is terminating
  157.     err = kill(cpid0, SIGUSR2);
  158.     err = kill(cpid1, SIGUSR2);
  159.     sleep(2);
  160.  
  161.     //controller letting user know its ending
  162.     printf("Controller: ending.\n");
  163.  
  164.     //results from game displayed
  165.     printf("\nResults\n");
  166.     printf("-----------------");
  167.     printf("\nPlayer 0 wins = %d\nPlayer 1 wins = %d\nDraws = %d\n", p0Win, p1Win, draw);
  168.     printf("-----------------\n\n");
  169.  
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement