РЕДАКТИРОВАНИЕ: ** ВОПРОС ОТВЕТИЛ: см. Комментарии 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
Где этот код в основном основан на.