2013-03-04 5 views
0

J'ai travaillé plus sur les tuyaux et je me demandais s'il y avait un moyen de lire et d'écrire dans le même processus en utilisant le tuyau. Voici mon code:Communication par tuyaux en C

// Creates 2 pipes per child 
    for (i=0; i<atoi(argv[1]); i++) { 
     pipe(fd[i]); 
    } 

    for(i = 0; i < atoi(argv[1]); i++) { 
     pid = fork(); 
     //pipe(fd); 
     int r[2]; 
     int check=0; 
     srand(getpid()); 
     int** Board=build_board(width); 
     if(pid < 0) { 
      printf("Error"); 
      exit(1); 
     } else if (pid == 0) { 
      printf("Child (%d): %d\n", i + 1, getpid()); 

      // srand(getpid()); 

      makeMove(Board, 2,r); 
      printf("Child R: %d:%d\n", r[0],r[1]); 
      display(Board, width, width); 

      close(fd[i][0]); 

      write(fd[i][1], r, sizeof(r)); 


     // play(Board); 
      exit(0); 
     } else { 
      printf("Parent (%d): %d\n", i + 1, getpid()); 

      while (1) { 

       if (check==0) { 

       close(fd[i][1]); 
       read(fd[i][0], readbuffer, sizeof(readbuffer)); 
       printf("Received string: %d:%d\n", readbuffer[0], readbuffer[1]); 

       Board[readbuffer[0]][readbuffer[1]]=2; 
       puts("Fixed Board"); 
       display(Board, width, width); 
       check=checkVictory(Board); 

       if (check!=0) { 
        puts("Winner"); 
        display(Board, width, width); 
        break; 
       } 

       //srand(getpid()); 
       AI_move(Board,1,2); 
       display(Board, width, width); 

       } 
      } 
      wait(NULL); 
     } 
    } 

Je suis en train d'envoyer des va et vient entre les deux processus, mais avec le code que j'ai-je obtenir le premier pas de l'enfant, le parent se déplace juste jusqu'à ce qu'il gagne. Je crois qu'après le déménagement du parent, je dois réécrire à l'enfant, mais je ferme cette capacité au sommet du processus de l'enfant. Comment et je communique les uns avec les autres jusqu'à ce qu'un gagnant soit trouvé et quand on sortira.

Voici quelques exemple de sortie:

Parent (1): 17291 
Child (1): 17293 
Child laced peice at: 7,3 
Child R: 7:3 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - B - - - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - B - - - - 
Parent placed peice at: 7,5 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - B - R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - B - R - - 
Parent placed peice at: 6,5 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - B - R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - B - R - - 
Parent placed peice at: 7,4 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - B R R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - B R R - - 
Parent placed peice at: 7,0 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
R - - B R R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
R - - B R R - - 
Parent placed peice at: 7,2 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
R - R B R R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
R - R B R R - - 
Parent placed peice at: 6,2 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - R - - R - - 
R - R B R R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - R - - R - - 
R - R B R R - - 
Parent placed peice at: 5,5 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - R - - R - - 
R - R B R R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - R - - R - - 
R - R B R R - - 
Parent placed peice at: 4,5 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - - - R - - 
- - R - - R - - 
R - R B R R - - 
Received string: 7:3 
Fixed Board 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - - - R - - 
- - R - - R - - 
R - R B R R - - 
Winner 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - - - - 
- - - - - R - - 
- - - - - R - - 
- - R - - R - - 
R - R B R R - - 
+0

N'utilisez pas atoi (argv [1]) 'comme boucle liée; utilisez 'int num = atoi (argv [1]);' puis utilisez 'num' comme limite dans les boucles. –

+0

Merci, je le sais, mais ce n'est que le tester pour le produit final, je voudrais m'assurer que l'entrée était un nombre entier en premier. alors nous comme vous l'avez suggéré. – jg943

+0

Je suis confus sur le rôle de 'argv [1]'. Si cela ne peut être que 2, pourquoi est-ce un argument? Si ce n'est pas limité à 2, cela signifie que vous avez beaucoup d'enfants. Le jeu est-il fait par deux processus enfants, ou entre le parent et un enfant? –

Répondre

0

Voici les grandes lignes de code qui est à peu près comment je le mettre en œuvre. Je suppose que les deux joueurs seront le processus parent et enfant; Je ne sais pas comment deux enfants travailleraient avec le parent.

#include <errno.h> 
#include <stdarg.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

static void err_exit(const char *, ...); 
static void be_childish(int fd_in, int fd_out); 
static void be_parental(int fd_in, int fd_out); 

int main(void) 
{ 
    pid_t pid; 
    int to_child[2]; 
    int to_parent[2]; 

    if (pipe(to_child) != 0 || pipe(to_parent) != 0) 
     err_exit("Failed to open pipe"); 
    if ((pid = fork()) < 0) 
     err_exit("Failed to fork"); 

    if (pid == 0) 
    { 
     close(to_child[1]); 
     close(to_parent[0]); 
     be_childish(to_child[0], to_parent[1]); 
    } 
    else 
    { 
     close(to_child[0]); 
     close(to_parent[1]); 
     be_parental(to_parent[0], to_child[1]); 
    } 
    return(0); 
} 

static void be_childish(int fd_in, int fd_out) 
{ 
    srand(getpid()); 
    char buffer[32]; 
    ssize_t nbytes; 

    while ((nbytes = read(fd_in, buffer, sizeof(buffer))) > 0) 
    { 
     /* Process parent's move from buffer */ 
     /* Write child's move to buffer */ 
     nbytes = strlen(buffer); 
     if (write(fd_out, buffer, nbytes) != nbytes) 
      err_exit("Short write from child to parent"); 
    } 
} 

static void be_parental(int fd_in, int fd_out) 
{ 
    srand(getpid()); 
    char buffer[32]; 
    ssize_t nbytes; 

    /* Determine first move */ 
    nbytes = strlen(buffer); 

    if (write(fd_out, buffer, nbytes) != nbytes) 
     err_exit("Short write from parent to child"); 
    while ((nbytes = read(fd_in, buffer, sizeof(buffer))) > 0) 
    { 
     /* Process child's move from buffer */ 
     /* Write parent's move to buffer */ 
     nbytes = strlen(buffer); 
     if (write(fd_out, buffer, nbytes) != nbytes) 
      err_exit("Short write from parent to child"); 
    } 
} 

static void err_exit(const char *fmt, ...) 
{ 
    int errnum = errno; 
    va_list args; 
    va_start(args, fmt); 
    vfprintf(stderr, fmt, args); 
    va_end(args); 
    if (errnum != 0) 
     fprintf(stderr, " (%d: %s)", errnum, strerror(errnum)); 
    putc('\n', stderr); 
    exit(1); 
} 

La fonction err_exit() simplifie les rapports d'erreurs - une seule ligne normalement au point où est signalé l'erreur. Vous pouvez utiliser des variations infinies sur le thème, mais avoir de telles fonctions simplifie grandement la recherche d'erreurs.