Tag: 缓冲区

在C中检查全零缓冲区的更快方法?

我正在寻找一种更快的方法来完成这个: int is_empty(char * buf, int size) { int i; for(i = 0; i < size; i++) { if(buf[i] != 0) return 0; } return 1; } 我知道我正在寻找一个微观优化,除非在极端情况下,但我知道存在更快的方法,我很好奇它是什么。

使用write()系统调用编写完整缓冲区

我想使用write系统调用在TCP套接字上写一个填充BUFF_SIZE字节的缓冲区: #include ssize_t write(int fd, const void *buf, size_t count); 文件说明了这一点 write()写入从缓冲区指向buf的count个字节到文件描述符fd引用的文件。 当然,写入的实际字节数可以通过返回值来检测。 但是,如果我想确保通过连接发送整个字节缓冲区,那么这样做的好方法是什么? 到目前为止,我在想: while ( (ch = fgetc(pipe) ) != EOF ) { buff[ 0 ] = ch; bytes_in_buff++; // fill a buffer’s worth of data from the pipe for (int i = 1; i < BUFF_SIZE; ++i, ++bytes_in_buff) { if ( (ch […]

如何确定分配的C缓冲区的大小?

我有一个缓冲区,想要做一个测试,看看缓冲区是否有足够的容量,我可以找到我可以添加到缓冲区的元素数量。 char *buffer = (char *)malloc(sizeof(char) * 10); 做一个 int numElements = sizeof(buffer); 不回10,有关如何实现这一点的任何想法?

在C中将文本文件读入缓冲区的正确方法?

我正在处理我希望在处理它们时读入缓冲区的小文本文件,所以我想出了以下代码: … char source[1000000]; FILE *fp = fopen(“TheFile.txt”, “r”); if(fp != NULL) { while((symbol = getc(fp)) != EOF) { strcat(source, &symbol); } fclose(fp); } … 这是将文件内容放入缓冲区还是滥用strcat()的正确方法? 然后我遍历缓冲区: for(int x = 0; (c = source[x]) != ‘\0’; x++) { //Process chars }

C中的缓冲和非缓冲输入

有没有办法弄清楚input是buffered还是非unbuffered (除了手册页。)? 我们不能通过查看函数的名称来弄清楚吗? 也适用于echoing和非nonechoing…有关快速参考,哪里可以找到具有Buffered , Unbuffered , echoing和非nonechoing输入详细信息的列表?

为什么改变SO_RCVBUF的值不起作用?

我正在创建一个程序来创建一个RAW套接字,以便读取所有流量。 在socket()和recvfrom()的调用之间(最后一个是循环以从缓冲区中取出所有数据包)我等待5s。 当我运行程序时,我用“快速模式”(快速填充缓冲区)的hping3命令向我的程序发送大约200个数据包。 只要5s过去,我的程序就会从缓冲区中提取大约150个数据包。 我尝试更改接收缓冲区的大小以获得更好的结果: int a = 65535; if ( (setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int)) ) < 0 ) { fprintf(stderr, "Error setting sock opts..\n"); } 但是,无论是“a”,1还是10000000的值,它似乎都没有变化,我仍然可以从缓冲区获得~150个数据包。 有什么问题? 编辑:使用getsockopt调用validation«a»的值。

在磁盘I / O期间窗帘后面发生了什么?

当我在文件中寻找某个位置并写入少量数据(20个字节)时,幕后会发生什么? 我的理解 据我所知,可以从磁盘写入或读取的最小数据单元是一个扇区(传统上是512字节,但该标准现在正在改变)。 这意味着写入需要读取整个扇区的20个字节,在内存中修改其中一些并将其写回磁盘。 这是我期望在无缓冲I / O中发生的事情。 我还希望缓冲的I / O做大致相同的事情,但要聪明一点。 所以我会想,如果我通过随机搜索和写入来打破窗口的局部性,缓冲和无缓冲的I / O应该具有相似的性能……也许无缓冲的出现稍微好一些。 然后,我知道缓冲I / O仅缓冲一个扇区是疯狂的,所以我也可能期望它执行得非常糟糕。 我的应用程序 我正在存储由SCADA设备驱动程序收集的值,该驱动程序接收超过十万点的远程遥测。 文件中有额外的数据,每条记录为40个字节,但在更新期间只需要写入20个字节。 预执行基准 为了检查我是否需要想出一些出色的过度设计的解决方案,我已经使用写入文件的几百万随机记录进行了测试,该文件可能包含总共200,000条记录。 每个测试都使用相同的值对随机数发生器进行种子处理。 首先,我擦除文件并将其填充到总长度(大约7.6兆),然后循环几百万次,将随机文件偏移和一些数据传递给两个测试函数之一: void WriteOldSchool( void *context, long offset, Data *data ) { int fd = (int)context; lseek( fd, offset, SEEK_SET ); write( fd, (void*)data, sizeof(Data) ); } void WriteStandard( void *context, long offset, Data […]

char数组中可以有多少个字符?

#define HUGE_NUMBER ??? char string[HUGE_NUMBER]; do_something_with_the_string(string); 我想知道什么是我可以添加到char数组的最大数量,而不会冒任何潜在的内存问题,缓冲区溢出等风险。 我想让用户输入,也许最大可能。

有没有办法偷看stdin缓冲区?

我们知道stdin默认是一个缓冲输入; 证据就是使用了在stdin上“保留数据”的任何机制,例如scanf() : int main() { char c[10] = {‘\0’}; scanf(“%9s”, c); printf(“%s, and left is: %d\n”, c, getchar()); return 0; } ./a.out 你好 你好,左边是10 10当然是新行…… 我一直很好奇,有没有办法“偷看” stdin缓冲区而不删除那里可能存在的东西? 编辑 一个更好的例子可能是: scanf(“%9[^.]”, c); 输入“at.ct”,现在我在stdin留下了“数据”( ct\n ),而不仅仅是换行符。