Tag: 缓冲

关于fork和printf / write

可能重复: fork()和输出 通过运行: #include int main() { fork(); printf(“b”); if (fork() == 0) { write(1, “a”, 1); }else{ write(1, “c”, 1); } return 0; } 我有cbcabbab ,有人可以向我解释输出吗? 如果可能的话,是否有工具可以逐步查看运行程序?

为什么移动缓冲区指针会减慢fread(C编程语言)?

我正在使用C中的fread读取1 GB文件。我正在使用以下循环以1MB块读取文件: FILE *fp; fp = fopen(filename, “rb”); unsigned char* buf; buf = malloc(CHUNK_SIZE); for(i = 0; i < NUMBER_OF_CHUNKS; ++i) { fread(buf, CHUNK_SIZE, 1, fp); //Do something with contents of buffer } fclose(fp); 以这种方式读取文件大约需要2秒钟。 但是,我决定我想为整个文件的内容分配一个大缓冲区,并在每次迭代时在fread函数内“移动缓冲区指针”,如下所示: FILE *fp; fp = fopen(filename, “rb”); unsigned char* buf; buf = malloc(CHUNK_SIZE * NUMBER_OF_CHUNKS); for(i = 0; i < […]

将数据写入文件:fflush()需要花费大量时间

我有一个要求,我必须缓冲大量数据(以GB为单位),以备将来使用。 由于没有足够的RAM可用于缓冲如此大量的数据,我决定将数据存储在一个文件中。 现在的缺陷是,当我将数据写入文件时,其他线程可能需要“缓冲”数据,因此每次我写入内容时都必须刷​​新文件流。 确切地说,数据是我作为预先记录的数据(如TiVo)缓冲的video帧,其他线程可能或可能不想在任何给定的时间点写入它,但是当它们这样做时,它们会从文件和进程中fread框架。 在一般情况下, fwrite – fflush组合大约需要150 us,但偶尔(并且相当规律),组合需要超过1.5秒。 我无法负担这一点,因为我必须实时处理帧。 我在这里有很多问题: 我在文件中缓冲数据的方法是否正确? 我有什么替代品? 知道为什么fwrite-fflush操作在某些情况下会突然花费更多时间吗? 请注意,在1.5秒后,它会恢复到150 us。

隐藏用户输入,仅允许某些字符

有什么方法可以在C中询问时隐藏用户输入吗? 例如: char *str = malloc(sizeof(char *)); printf(“Enter something: “); scanf(“%s”, str);getchar(); printf(“\nYou entered: %s”, str); // This program would show you what you were writing something as you wrote it. // Is there any way to stop that? 另一件事,是你怎么才允许某些角色? 例如: char c; printf(“Yes or No? (y/n): “); scanf(“%c”, &c);getchar(); printf(“\nYou entered: %c”, c); // […]

设置管道缓冲区大小

我有一个C ++multithreading应用程序,它使用posix管道,以便有效地执行线程间通信(所以我不必为死锁而疯狂)。 我已将写操作设置为非阻塞,因此如果缓冲区中没有足够的空间可写,则编写器将收到错误。 if((pipe(pipe_des)) == -1) throw PipeException(); int flags = fcntl(pipe_des[1], F_GETFL, 0); // set write operation non-blocking assert(flags != -1); fcntl(pipe_des[1], F_SETFL, flags | O_NONBLOCK); 现在我希望将管道缓冲区大小设置为自定义值(在特定情况下为一个单词)。 我用谷歌搜索了它,但我找不到任何有用的东西。 有办法(可能是posix兼容)吗? 谢谢 洛伦佐 PS:我在linux下(如果它可能有用)

使用C中的fread从stdin缓冲读取

我试图通过在`_IOFBF~模式中使用setvbuf来有效地读取stdin 。 我是新来的缓冲。 我正在寻找工作实例。 输入以两个整数( n , k )开头。 接下来的n行输入包含1个整数。 目的是打印可以被k整除的k 。 #define BUFSIZE 32 int main(){ int n, k, tmp, ans=0, i, j; char buf[BUFSIZE+1] = {‘0’}; setvbuf(stdin, (char*)NULL, _IONBF, 0); scanf(“%d%d\n”, &n, &k); while(n>0 && fread(buf, (size_t)1, (size_t)BUFSIZE, stdin)){ i=0; j=0; while(n>0 && sscanf(buf+j, “%d%n”, &tmp, &i)){ //printf(“tmp %d – scan %d\n”,tmp,i); //for […]

为什么printf()在睡眠前没有打印任何东西()?

我只是用Kernighan和Ritchie的书学习C语言; 我是第四章的基础知识(函数)。 前几天我对sleep()函数感到好奇,所以试着像这样使用它: #include #include int main(void) { printf(” I like cows.”); sleep(5); return 0; } 问题是程序的输出,看起来它首先是sleep()然后是printf() ,换句话说,它等待五秒然后打印字符串。 所以我想,也许程序会如此快速地sleep() ,以至于它不会让printf()像我想要的那样完成他的工作,即打印字符串然后再睡觉。 如何显示字符串然后让程序进入睡眠状态? 编译器是OpenBSD 4.3中的GCC 3.3.5(propolice)。 PS我不知道你如何正确地放置预处理器线。

fork()打印前的语句两次

我正在尝试使用fork()并重新定向以检查父项中的重定向是否也适用于孩子。 我写了以下简单的程序 #include #include #include int main () { freopen( “error.txt”, “w+t”, stdout ); // From now on, stdout = error.txt printf (” ERROR! WHY DONT U UNDERSTAND?\n”); if ( fork() == 0 ) { printf(” I AM CHILD\n”); exit(0); } else- { printf (” EITHER I AM A PARENT OR SOMETHING GOT SCREWED\n”); } […]

如何在内存中缓冲stdout并从专用线程写入

我有一个包含许多工作线程的C应用程序。 至关重要的是这些不会阻塞工作线程需要写入磁盘上的文件,我让它们写入内存中的循环缓冲区,然后有一个专用线程将该缓冲区写入磁盘。 工作线程不再阻塞。 专用线程可以在写入磁盘时安全地阻塞,而不会影响工作线程(写入磁盘时它不会保持锁定)。 我的内存缓冲区调整得足够大,以至于编写器线程可以跟上。 一切都很好。 我的问题是,我如何为stdout实现类似的东西? 我可以将macro printf()写入内存缓冲区,但是我无法控制可能写入stdout的所有代码(其中一些代码在第三方库中)。 思考? NickB