Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //File: controller.c
- //Robert Entenmann
- //CSCI311
- //Project 6
- #include "player.h"
- static int i = 0;
- //usr1 handler
- void usr1Handler (int sig)
- {
- i++;
- printf("Controller: received ready, total = %d\n", i);
- }
- int main(int argc, char **argv)
- {
- //making variables
- int fromP0[2], fromP1[2];
- int p0, p1, err, games;
- int p0Win = 0, p1Win = 0, draw = 0;
- char par[10], inP0[100], inP1[100], ppidS[20];
- pid_t cpid0, cpid1, ppid;
- /*Checks for correct number of arguments*/
- if ((argc != 2) || ((games = atoi(argv[1])) <= 0))
- {
- fprintf(stderr,"Usage: %s games\n", argv[0]);
- exit(1);
- }
- //creating sigaction USR1
- struct sigaction usr1_act;
- /* Set signal handler. */
- usr1_act.sa_handler = (void(*)(int))usr1Handler;
- sigemptyset(&usr1_act.sa_mask);
- usr1_act.sa_flags = 0;
- err = sigaction (SIGUSR1, &usr1_act, NULL);
- //error on sigaction
- if (err == -1)
- {
- printf ("CSIG1: Received error %d on sigaction.\n", errno);
- exit(4);
- }
- //creating pipes for player 0
- ppid = getpid();
- sprintf(ppidS, "%d", ppid);
- //error with piping for player 0 and 1
- if(pipe(fromP0) == -1)
- {
- printf("Error on pipe creation. Exiting...");
- exit(1);
- }
- if(pipe(fromP1) == -1)
- {
- printf("Error on pipe creation. Exiting...");
- exit(1);
- }
- //creating player 0
- cpid0 = fork();
- //error with creating
- if(cpid0 < 0)
- {
- printf("Error in forking. Exiting...");
- exit(1);
- }
- if(cpid0 == 0)
- {
- //setting pipes to player 0
- sprintf(par, "%d", fromP0[1]);
- close(fromP0[0]);
- err = execl("./player", "Player 0", par, ppidS, NULL);
- printf("err %d, errno %d\n", err, errno);
- }
- // add wait to prevent having same srand value
- pause();
- sleep(1);
- //creating player 0
- cpid1 = fork();
- //error with creating
- if(cpid1 < 0)
- {
- printf("Error in forking. Exiting...");
- exit(1);
- }
- if(cpid1 == 0)
- {
- //setting pipes to player 1
- sprintf(par, "%d", fromP1[1]);
- close(fromP1[0]);
- execl("./player", "Player 1", par, ppidS, NULL);
- }
- //pause for ready signals
- pause();
- printf("Controller: all players are ready.\n\n");
- //flag for # of games
- for(int i = 1; i <= games; i++)
- {
- //signal to players to message pick
- err = kill(cpid0, SIGUSR1);
- printf("Controller: Sending show command to Player 0\n");
- sleep(1);
- err = kill(cpid1, SIGUSR1);
- printf("Controller: Sending show command to Player 1\n");
- sleep(1);
- //read pick from pipe for both players
- read(fromP0[0], inP0, 100);
- read(fromP1[0], inP1, 100);
- //getting pick as int
- p0 = atoi(inP0);
- p1 = atoi(inP1);
- //function to pick what pick based on integer value
- pickHand(p0, p1, i);
- sleep(1);
- //compare response and decide winner
- //player 1 wins
- if ((p0 == 0 && p1 == 1) || (p0 == 1 && p1 == 2) || (p0 == 2 && p1 == 0))
- {
- printf("Controller: Round %d: player 1 wins\n\n", i);
- p1Win++;
- }
- //player 0 wins
- else if ((p0 == 2 && p1 == 1) || (p0 == 1 && p1 == 0) || (p0 == 0 && p1 == 2))
- {
- printf("Controller: Round %d: player 0 wins\n\n", i);
- p0Win++;
- }
- //draw
- else
- {
- printf("Controller: Round %d: Draw\n\n", i);
- draw++;
- }
- sleep(1);
- }
- //done signal sent from contorller to both players using SIGUSR2
- //signal saying player is terminating
- err = kill(cpid0, SIGUSR2);
- err = kill(cpid1, SIGUSR2);
- sleep(2);
- //controller letting user know its ending
- printf("Controller: ending.\n");
- //results from game displayed
- printf("\nResults\n");
- printf("-----------------");
- printf("\nPlayer 0 wins = %d\nPlayer 1 wins = %d\nDraws = %d\n", p0Win, p1Win, draw);
- printf("-----------------\n\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement