gpt4 book ai didi

c - C 中管道、greps、wc 的堆栈崩溃问题

转载 作者:行者123 更新时间:2023-11-30 14:46:08 25 4
gpt4 key购买 nike

编辑:**问题已得到解答:请参阅 PaulMckenzie 和 Rishikesh Raje 的评论

此函数的目的是使用管道对参数 file 和参数 pattern 调用 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, "\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"在 main 中运行它会在 somefile 中输出正确数量的 somepatterns 以及典型的迁移错误- 在最后检查打印语句,之后它会因堆栈粉碎而终止。

读完堆栈粉碎后,似乎管道的某些末端过度扩展了读取或写入到非法空间。然而,我不确定在哪里或为什么会发生这种情况,因为在函数结束之前一切似乎都工作正常。这里关于堆栈粉碎的其他帖子暗示编译器将金丝雀扔到代码中,当堆栈粉碎可能发生时发出失败信号。问题也不在于 main 。谁能解释一下情况吗?

引用: http://crasseux.com/books/ctutorial/Programming-with-pipes.html

此代码主要基于此。

最佳答案

问题不在于管道。该问题与字符串与空字符串变量 grep_str 的串联有关,该变量显然无法容纳更多字符串。感谢 Paul 和 Rishikesh 的评论

关于c - C 中管道、greps、wc 的堆栈崩溃问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52529160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com