Execvp Зависает, когда вывод слишком велик? - PullRequest
0 голосов
/ 05 декабря 2018

Итак, у меня есть программа удаленной оболочки.Он работает хорошо, когда вывод не так велик, но когда я получаю большой вывод из команды, он зависает.

Вот фрагмент кода.Я могу подтвердить работу args, как и ожидалось.Так, например, если args [0] = "ps" и args = ["ps", "-ael", NULL].Родитель застрянет в ожидании ().Ребенок застревает на execvp ().Однако, если args - это просто ["ps", "-a", NULL], где меньше выходных данных, он не застревает в wait ().

Я должен отметить, что это то, что он дитмакинтошВ системе Linux происходит сбой и говорит free (): неверный следующий размер (нормальный).

 ...
if (fork() == 0) {
          printf("fork %s\n", "  ");
          close(STDOUT_FILENO);
          close(fds[0]);
          dup2(fds[1], STDOUT_FILENO);
          dup2(fds[0], STDIN_FILENO);
          dup2(errorPipe[1], STDERR_FILENO);
          close(fds[1]);
          fflush(stdout);

          if(0 < execvp(args[0], args)) {
               perror("execvp failed");
               printf("Command Failed! \n");
          }
      }

      printf("%s\n", "waiting");
      wait(0);
      printf("%s\n", "done waiting");
      char errorMessage[3000];
      read(fds[0], msg, command->messageSize);
      printf("msg %s\n", msg);
       ....

1 Ответ

0 голосов
/ 05 декабря 2018

Дочерний процесс ждет, пока вы прочитаете некоторые данные, прежде чем записать больше данных.Ядро не запомнит все данные за вас, только в ограниченном количестве.

Вы не читаете никаких данных, потому что ждете их завершения.Но это не закончится, пока вы не прочитаете данные.

free(): invalid next size (normal) - это совсем другая проблема - это означает, что вы перезаписываете некоторую память, которую вы не должны.

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