Непрерывная запись и чтение с использованием каналов с несколькими процессами - PullRequest
0 голосов
/ 21 января 2019

Мой код состоит из двух процессов.Родительский процесс постоянно читает один символ из stdin и записывает в канал (без необходимости нажимать ENTER).Дочерний процесс читает из канала и пишет в стандартный вывод.Мой родительский процесс успешно записывает в канал, но дочерний процесс не печатает вывод.

Причина, по которой дочерний процесс не распечатывает выходные данные, заключается в том, что он застрял в цикле while родительского процесса и никогда не входит в цикл while дочернего процесса.

Когда я принудительно завершаю работуродительский процесс, использующий Activity Monitor на моем Mac, то, что я набрал, на самом деле распечатывается.Затем следует «Killed: 9»

Есть ли способ исправить мой код, чтобы каждый раз, когда Родитель (Вход) получал символ, Дочерний (Выход) печатал каждый символ без попадания в цикл whileродительский процесс?

char input() {
  char input = getchar();
  return input;
}

int main(void) {

  int inputOutputFd[2];
  pid_t childpid = 0;

  system("/bin/stty raw igncr -echo");

  if(pipe(inputOutputFd) < 0) {
    perror("Failed to create pipe");
    return 1;
  }

  if((childpid = fork()) == -1) {
    perror("Failed to fork input child");
    return 1;
  }

//parent's code -INPUT
  if (childpid > 0) {
    close(inputOutputFd[0]);
    printf("Please enter a word or phrase");

    while(1) {
      char inputChar = input();
      write(inputOutputFd[1], &inputChar, sizeof(inputChar));
    }

    close(inputOutputFd[1]);
    wait(NULL);

  } else { 

//child -OUTPUT
    char outputChar;
    close(inputOutputFd[1]);
    while (read(inputOutputFd[0], &outputChar, sizeof(outputChar)) > 0) 
    {
      printf("%c", outputChar);
      fflush(stdin);
    }
  } //END OF IF-ELSE LOOP
}//END MAIN

1 Ответ

0 голосов
/ 21 января 2019

Все работает нормально, ничего не застряло или что-то еще, пока вы не ожидаете вывода в вашей консоли.Ошибка в этих двух строках:

  printf("%c", outputChar);
  fflush(stdin);

stdin - это стандартный ввод .Вы пишете в стандартный вывод .

  printf("%c", outputChar);
  fflush(stdout);

работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...