Использование каналов для связи процессов - PullRequest
0 голосов
/ 08 ноября 2010

У меня проблема с использованием каналов в c для Linux. Моя работа следующая:

Напишите программу на c, которая создаст ребенка. Дочерний процесс собирается общаться с отцовским процессом, используя pipe. Процесс отца выдаст случайное число в диапазоне от 0 = y, затем отец спросит у пользователя его имя, и он опубликует его следующим образом (Джордж -> egroeG).

Мой код следующий:

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   #include <signal.h>
   #include <unistd.h>
   #include <fcntl.h>

void myalarm(int sig) {
 printf("\nTime is out. Exiting...\n");
 exit(0);
}
int main(int argc, char **argv){

   int x, x1, n, m, pid, fd1[2];
   int y = rand() % 100 + 2;
   int i=0;
   char *name, *arxi;

 if (pipe(fd1) == -1) {
  perror("ERROR: Creating Pipe\n");
  exit(1);
 }
  pid = fork();
   switch(pid) { 
    case -1:
     perror("ERROR: Creating Child Proccess\n");
     exit(99);
    case 0:
     close(fd1[0]);   /*Writer*/
     printf("\nGive a number between 1 & 100:\n");
     scanf("%d", &x);

     n = write(fd1[1], x, 1);
/*dup2(fd1[0],0);*/
      while (x < 0 || x > 100) {
       printf("ERROR:You gave a wrong number...");
       printf("\nGive a number between 1 & 100:\n");
       scanf("%d", &x); 
      }
     close(fd1[1]);
     break;
    default:
     close(fd1[1]);   /*Reader*/
     printf("I Am The Father Process...\n");
     printf("y = %d\n", y);

     m = read(fd1[0], x1, 0);
/*dup2(fd1[1],1);*/   close(fd1[0]);

      if (x1 < y) {
       kill(pid, SIGTERM); //termination of the child process

      }
      else {
       signal(SIGALRM, myalarm); 
       printf("Please, type in your name:\n");
       fflush(stdout);
       alarm(10);   //Start a 10 seconds alarm
       scanf("%s", name);
       arxi = name;
       alarm(0);
        while(*name != '\0') {
         name++;
        }
        name--;
        while(name >= arxi) {
         putchar(*name);
         name--; 
        }
       printf("%s\n", name); 
      }
     wait(&pid);
     break;
   }
return 0;
}

1 Ответ

0 голосов
/ 08 ноября 2010

Могут быть и другие проблемы, но они выскочили как неправильные:

n = write(fd1[1], x, 1);

Это будет записывать 1 байт с адреса x, что, вероятно, приведет к сбою.Вы хотите:

n = write(fd1[1], &x, sizeof(x));

Аналогично, это будет считывать 0 байтов по адресу x1, что ничего не будет делать:

m = read(fd1[0], x1, 0);

вы хотите:

m = read(fd1[0], &x1, sizeof(x1));
...