编辑: ** 问题已得到解答: 见PaulMckenzie和Rishikesh Raje的评论
此函数的目的是使用管道使用参数pattern
在参数file
上调用 grep,但我在程序中遇到堆栈粉碎问题。它贯穿并直接工作到函数的末尾,但随后抱怨堆栈粉碎。 这是我的代码:
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, " ");
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("%snn",grep_str); /* migrating bug-check print statement */
}
使用参数 file="somefile" 模式="somepattern" 通过 main 运行它,输出somefile
中正确的somepatterns
量,以及最后典型的迁移错误检查打印语句,之后它被终止以进行堆栈粉碎。
在阅读堆栈粉碎后,似乎管道的某个末端正在过度扩展读取或写入非法空间。但是,我不确定在哪里或为什么会发生这种情况,因为在功能结束之前一切似乎都很好。这里关于堆栈粉碎的其他帖子暗示,当可能发生堆栈粉碎时,编译器将金丝雀扔进代码中,发出失败信号。问题也不在于main
。谁能说明情况?
参考: http://crasseux.com/books/ctutorial/Programming-with-pipes.html
是此代码主要基于的位置。
问题不在于管道。该问题与字符串与空字符串变量的连接有关,grep_str显然无法在其中容纳更多字符串。感谢评论中的保罗和瑞诗凯诗