Проблема разбивки стека с трубами, greps, туалетом в C - PullRequest
0 голосов
/ 27 сентября 2018

РЕДАКТИРОВАНИЕ: ** ВОПРОС ОТВЕТИЛ: см. Комментарии PaulMckenzie и Rishikesh Raje

Цель этой функции - вызвать grep для параметра file с параметром pattern, используя каналы, но явозникли проблемы с разбивкой стека в моей программе.Он работает и работает до конца функции, но затем жалуется на разрушение стека.Вот мой код:

void count_pattern(char *file, char *pattern) {
  int bytes_read;
  int nbytes = 20000;
  char *read_string;
  char grep_str[] = "";
  FILE *grep_pipe;
  FILE *wc_pipe;

  strcat(grep_str, "grep ");
  strcat(grep_str, pattern);
  strcat(grep_str, " ");
  strcat(grep_str, file);
  strcat(grep_str, "\0");

  grep_pipe = popen (grep_str, "r");
  wc_pipe = popen ("wc -l", "w");

  /* Pipe Error Checking*/
  if ((!grep_pipe) || (!wc_pipe))
  {
      fprintf (stderr,"One or both pipes failed.\n");
  }
  /* Read from grep_pipe until EOF? */
  read_string = (char *) malloc (nbytes + 1);
  bytes_read = getdelim (&read_string, &nbytes, -1, grep_pipe);


  /* Close grep_pipe */
  if (pclose (grep_pipe) != 0)
  {
      fprintf (stderr, "Could not run 'grep'.\n");
  }

  /* Send output of 'grep' to 'wc' */
  fprintf (wc_pipe, "%s", read_string);

  /* Close wc_pipe */
  if (pclose (wc_pipe) != 0)
  {
      fprintf (stderr, "Could not run 'wc'.\n");
  }

printf("%s\n\n",grep_str); /* migrating bug-check print statement */
}

Запуск его через основной файл с параметрами file = "somefile" pattern = "somepattern" выводит правильное количество somepatterns в somefile, а также типичную ошибку миграции-проверка оператора print в самом конце, после чего он завершается для разрушения стека.

После прочтения разрушения стека создается впечатление, что какой-то конец канала чрезмерно расширяет чтение или запись в недопустимое пространство.Однако я не уверен, где и почему это происходит, поскольку, кажется, все работает нормально до конца функции.Другие посты о разрушении стека подразумевают, что компилятор бросает канарейку в код, сигнализирующий об ошибке, когда может произойти разрушение стека.Проблема не в main.Кто-нибудь может пролить свет на ситуацию?

Ссылка: http://crasseux.com/books/ctutorial/Programming-with-pipes.html

Где этот код в основном основан на.

1 Ответ

0 голосов
/ 27 сентября 2018

Проблема была не с трубами.Проблема была связана с объединением строк в пустую строковую переменную grep_str, которая явно не могла вместить больше строк.Благодарю Павла и Ришикеша в комментариях

...