Tag: 缓冲区

如何通过pthreads管理两个或更多的消费者?

我有一个通用的问题,我希望解决,从标准输入或常规文件流发送到应用程序的二进制数据块,然后将二进制数据转换为文本。 使用线程,我想在将文本传递给下一个应用程序之前处理文本,然后进一步修改该文本,依此类推。 作为一个简单的测试用例,我想通过gunzip提取压缩数据。 具体来说,我正在使用gunzip -c -提取通过其(重新分配的) stdin文件描述符发送给它的二进制数据块,然后从其(重新分配的) stdout文件描述符中提取出大量文本。 然后我可以将这些文本块打印到真正的stdout或stderr (或者做其他事情,稍后再做)。 (我意识到我可以在命令行上进行基于gzip的压缩和提取。我的目标是使用这个测试用例来学习如何在通过二进制文件运行数据的线程之间正确传递二进制和文本数据的通用块,或进一步处理。) 在我的测试程序中,我设置了三个pthread_t线程: produce_gzip_chunk_thread consume_gzip_chunk_thread consume_gunzip_chunk_thread 我为每个线程传递了一个名为thread_data的共享数据实例,它包含一个线程锁,两个条件,以及一些缓冲区和计数器变量。 我还为使用popen3()打开的gunzip进程popen3() : typedef struct pthread_data pthread_data_t; typedef struct popen3_desc popen3_desc_t; struct pthread_data { pthread_mutex_t in_lock; pthread_cond_t in_cond; pthread_cond_t out_cond; unsigned char in_buf[BUF_LENGTH_VALUE]; size_t n_in_bytes; size_t n_in_bytes_written_to_gunzip; size_t n_out_bytes_read_from_gunzip; FILE *in_file_ptr; boolean in_eof; char in_line[LINE_LENGTH_VALUE]; popen3_desc_t *gunzip_ptr; }; struct popen3_desc […]

“CRT检测到应用程序在堆缓冲区结束后写入内存”是什么意思?

我在使用此代码时遇到问题。 它在free(q-> izv)函数中断,我得到一个调试错误说: CRT detected that the application wrote to memory after end of heap buffer 我不知道这意味着什么,所以我会感激我得到的任何帮助。 typedef struct izvodjaci{ char *izv; int broj; struct izvodjaci *sled; }IZV; obrisi_i(IZV *p){ while (p){ IZV *q; q = p; p = p->sled; if (!strcmp(q->izv,”UNKNOWN”)) free(q->izv); free(q); } } 提前致谢

C – 键入字符时从stdin读取

如何在输入字符时填充80个字符的缓冲区,或者直到按下回车键或缓冲区已满,以先发生者为准。 我已经研究了很多不同的方法,但必须按下输入然后输入字符*在80处被切断。 谢谢。

从文件缓冲一组行并将其存储在C中的数组中

这可能是一种非常低效的方法,但它的工作方式 此代码读取文件,一次在全局数组中存储8行文本(如果可能,请提供更好的选项)并调度以进行进一步处理。 这是代码 int count = 0; //global char *array_buffer[8]; //global void line(char *line_char) { int lent = strlen(line_char); array_buffer[count] = line_char; printf(“%d\n”,count); if (count == 8) { int row,col; for(row = 0; row<count; row++){ printf("%d\n",row); for(col = 0; col<=lent; col++) { printf("%c", array_buffer[row][col]); } printf("\n"); } count = 0; } count++; } int main(int […]

如何编写ANSI C控制台屏幕缓冲区?

我正在制作一个基于ASCII的游戏,而且我看起来人们都说要使用来自MSDN的Console.Write(),如果你使用的是Windows,那就是花花公子,但我不是。 因此,我正在尝试在C中编写一个函数或一组函数,它们可以在两个屏幕缓冲区之间交替,并将它们写入屏幕,类似于手册页,以及pico,vim和emacs的。 我有缓冲区正在工作,并发现一个名为0verkill的旧的ASCII游戏,它使用C和putchar()将每个字符放在屏幕上,但我尝试重新创建它,导致文本连续流动,而不是窗口大小的静态文本面板。 我真的不想使用像curses这样的任何外部库(因为这会降低可移植性),并且如果可能的话,我希望保持ansi标准。 谢谢!

在C中读取字符串

如果我正在使用C gets(),并且我正在从用户那里读取一个字符串,但我不知道我需要多大的缓冲区,并且输入可能非常大。 有没有办法可以确定用户输入的字符串有多大,然后分配内存然后将其放入变量中? 或者至少是一种接受输入而不知道它有多大的方法,有可能它不适合我已经分配的缓冲区。

使用%* c清除scanf缓冲区的危险

在scanf()中使用%* c来清除缓冲区是否有任何危险。 例如: char c; for (int i = 0; i < 5; i++) { scanf("%c%*c", &c); } 要么 char* str; char c; int i; scanf(“%s”, str); scanf(“%d%*c”, &i); scanf(“%c%*c”, &c); 是否应该关注缓冲区溢出或其他安全问题? 似乎没有关于在scanf中使用星号的正式文档用于C( 编辑这不是真的),所以我很难找到输入的额外字符究竟发生了什么。 有没有更好的方法清除C中的scanf缓冲区?

-fno-stack-protector有什么用?

我用C编写了一个应用程序,我试图在编译时理解-fno-stack-protector命令的用途是什么。 对于我的特定应用程序,如果我在防止缓冲区溢出方面使用此命令,则没有任何区别。 我在网上看到-fstack-protector和-fno-stack-protector命令分别启用和禁用堆栈粉碎保护器,但如果我自己编译应用程序,如何预先启用保护器? 命令的使用是否可能取决于运行应用程序的系统?

缓冲增长策略

我有一个通用的增长缓冲区,用于累积“随机”字符串片段,然后获取结果。 处理该缓冲区的代码用简单的C编写。 伪代码API: void write(buffer_t * buf, const unsigned char * bytes, size_t len);/* appends */ const unsigned char * buffer(buffer_t * buf);/* returns accumulated data */ 我正在考虑应该为缓冲区选择的增长策略。 我不知道我的用户是喜欢内存还是速度 – 或者用户数据的性质是什么。 我已经看到了两种策略:按固定大小增量增长缓冲区(这是我目前正在实现的)或以指数方式增长数据。 (还有一种策略来分配所需的确切内存量 – 但在我的情况下这并不是那么有趣。) 也许我应该让用户选择策略……但这会让代码变得更复杂…… 曾几何时,Herb Sutter 写道 (引用Andrew Koenig),最好的策略可能是因子1.5指数增长(寻找“成长策略”)。 这还是最好的选择吗? 任何建议? 你的经历说什么?

在C ++中使用’recg’和’MSG_PEEK’获取套接字中可用的字节数

C ++具有以下函数来从套接字接收字节,它可以检查MSG_PEEK标志可用的字节数。 使用MSG_PEEK ,’recv’的返回值是socket中可用的字节数: #include ssize_t recv(int socket, void *buffer, size_t length, int flags); 我需要在不创建buffer情况下获取套接字中可用的字节数(不为buffer分配内存)。 有可能吗?怎么样?