1. C语言中,什么是缓冲文件系统和文件缓冲区
目前c语言使用的文件系统分为缓冲文件系统(标准i
/
o)和非缓冲文件系统(系统i
/
o)。缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执
行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。
因此当程序运行时虽然进行了写数据操作,但是如果写入的数据没有装满内存中的缓冲区,就不会将数据写入到磁盘文件中。当程序运行结束后,系统就会将缓冲区中的数据写入到磁盘上的文件中,因此就可以看到文件中的内容。
常用的fopen命令就会使用文件读写缓冲区,fclose命令关闭文件,把缓冲区中的内容写入磁盘上的文件中。详见:
http://study.qqcf.com/web/171/19812.htm
2. 在DOS中生成高速缓存的命令是
smartdrv.exe
smartdrv.exe 是一个程序文件,用来在扩充内存中创建一个磁盘高速缓存区域,
从而缩短读写硬盘的时间。只用系统拥有硬盘与扩充内存的时候,系统才可以。
SMARTDRV.EXE可以通过命令行方式执行,还能完成通过CONFIG.SYS创建双缓冲,
以便给在EMM386提供的内存活WINDOWS 386增强模式中不能正常运行的硬盘控制
器提供兼容性。
1、-------------命令行方式
SMARTDRV [/E:区块大小][/B:BUFFER大小] [/C] [/R] [/L] [/Q] [/V] [/S]
[init cache size] [win cache size] [Drive +/-]
DRIVE +/- 指定某一个磁盘拥有磁盘缓存功能, 如果不加 +/- 就表示只允许
读取缓存
/E:区块大小 指定SMARTDRIVE 在内存与磁盘之间移动数据的每次搬移基本量。
区块大小只能是 1024/2048/4096/8192
INIT CACHE SIZE 启动SMARTDRIVE 时候拥有磁盘高速缓冲区的大小 单位是K
这个数值越大,磁盘存取工作的效果越好
WIN CACHE SIZE 指定SMARTDRIVE 将为WINDOWS减少多少高速缓冲区。
/B:BUFFER SIZE 表示缓冲区的大小。缓冲区越大,占用常规内存越多,缺省
是16
/C 把内存中的所有缓冲区信息写入硬盘
/R 清除所有高速缓冲区内容,重新启动SMARTDRIVE
/L 不把SMARTDRV.EXE程序装入UMB,不过不加此参数,系统会自动把
SMARTDRV.EXE 调入UMB
/V 设定在启动SMARTDRIVE的时候,屏幕显示状态信息
/Q 不显示状态信息,但是如果程序执行出错,就会显示
/S 显示附加信息
3. shell里有没有类似于C语言fflush这种,刷新缓冲区的命令
楼主指的是 linux Shell 吧?
1. 试试 sync 命令。
sync writes any data buffered in memory out to disk.
但不清楚是不是将缓冲区给清空了。
2. sync不行的话用 awk 吧,awk里的语法同C语言,可以直接使用C语句。
echo "" | awk '{fflush()}'
4. 什么叫‘缓冲区’电脑术语
缓冲区溢出
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。
缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
example0.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
-----------------------------------------------------------
上面的strcpy()将直接把str中的内容到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。在C语言中,静态变量是分配在数据段中的,动态变量是分配在堆栈段的。缓冲区溢出是利用堆栈段的溢出的。一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置如下:
/――――――――\ 内存低端
|程序段|
|―――――――――|
|数据段|
|―――――――――|
|堆栈|
\―――――――――/内存高端
堆栈是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,PUSH和POP。PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。在高级语言中,程序函数调用和函数中的临时变量都用到堆栈。参数的传递和返回值是也用到了堆栈。通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。另外还有一个基址指针(FP,在Intel芯片中是BP),许多编译器实际上是用它来引用本地变量和参数的。通常,参数的相对FP的偏移是正的,局部变量是负的。当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容,做为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。
下面举个例子:
example1.c:
------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
-----------------------------------------------------------
为了理解程序是怎样调用函数function()的,使用-S选项,在Linux下,用gcc进行编译,产生汇编代码输出:
$ gcc -S -o example1.s example1.c
看看输出文件中调用函数的那部分:
pushl $3
pushl $2
pushl $1
call function
这就将3个参数压到堆栈里了,并调用function()。指令call会将指令指针IP压入堆栈。在返回时,RET要用到这个保存的IP。在函数中,第一要做的事是进行一些必要的处理。每个函数都必须有这些过程:
pushl %ebp
movl %esp,%ebp
subl $20,%esp
这几条指令将EBP,基址指针放入堆栈。然后将当前SP拷贝到EBP。然后,为本地变量分配空间,并将它们的大小从SP里减掉。由于内存分配是以字为单位的,因此,这里的buffer1用了8字节(2个字,一个字4字节)。Buffer2用了12字节(3个字)。所以这里将ESP减了20。这样,现在,堆栈看起来应该是这样的。
低端内存高端内存
buffer2 buffer1 sfp ret a b c
< ------ [ ][ ][ ][ ][ ][ ][ ]
栈顶栈底
缓冲区溢出就是在一个缓冲区里写入过多的数据。那怎样利用呢,看
一下下面程序:
example2.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
void main() {
char large_string[256];
int i;
for( i = 0; i < 255; i++)
large_string[i] = 'A';
function(large_string);
}
------------------------------------------------------------
这个程序是一个经典的缓冲区溢出编码错误。函数将一个字符串不经过边界检查,拷贝到另一内存区域。当调用函数function()时,堆栈如下:
低内存端buffer sfp ret *str高内存端
< ------ [ ][ ][ ][ ]
栈顶栈底
很明显,程序执行的结果是"Segmentation fault (core mped)"或类似的出错信息。因为从buffer开始的256个字节都将被*str的内容'A'覆盖,包括sfp, ret,甚至*str。'A'的十六进值为0x41,所以函数的返回地址变成了0x41414141, 这超出了程序的地址空间,所以出现段错误。可见,缓冲区溢出允许我们改变一个函数的返回地址。通过这种方式,可以改变程序的执行顺序。
键盘的内部有一块微处理器,它控制着键盘的全部工作,比如主机加电时键盘的自检、扫描,扫描码的缓冲以及与主机的通讯等等。当一个键被按下时,微处理器便根据其位置,将字符信号转换成二进制码,传给主机和显示器。如果操作人员的输入速度很快或CPU正在进行其它的工作,就先将键入的内容送往内存中的键盘缓冲区,等CPU空闲时再从缓冲区中取出暂存的指令分析并执行
5. 在DOS里提高缓存的命令是什么,或者用其它的方法.
smartdrv.exe
smartdrv.exe 文件的使用方法
smartdrv.exe 是一个程序文件,用来在扩充内存中创建一个磁盘高速缓存区域,
从而缩短读写硬盘的时间。只用系统拥有硬盘与扩充内存的时候,系统才可以。
SMARTDRV.EXE可以通过命令行方式执行,还能完成通过CONFIG.SYS创建双缓冲,
以便给在EMM386提供的内存活WINDOWS 386增强模式中不能正常运行的硬盘控制
器提供兼容性。
1、-------------命令行方式
SMARTDRV [/E:区块大小][/B:BUFFER大小] [/C] [/R] [/L] [/Q] [/V] [/S]
[init cache size] [win cache size] [Drive +/-]
DRIVE +/- 指定某一个磁盘拥有磁盘缓存功能, 如果不加 +/- 就表示只允许
读取缓存
/E:区块大小 指定SMARTDRIVE 在内存与磁盘之间移动数据的每次搬移基本量。
区块大小只能是 1024/2048/4096/8192
INIT CACHE SIZE 启动SMARTDRIVE 时候拥有磁盘高速缓冲区的大小 单位是K
这个数值越大,磁盘存取工作的效果越好
WIN CACHE SIZE 指定SMARTDRIVE 将为WINDOWS减少多少高速缓冲区。
/B:BUFFER SIZE 表示缓冲区的大小。缓冲区越大,占用常规内存越多,缺省
是16
/C 把内存中的所有缓冲区信息写入硬盘
/R 清除所有高速缓冲区内容,重新启动SMARTDRIVE
/L 不把SMARTDRV.EXE程序装入UMB,不过不加此参数,系统会自动把
SMARTDRV.EXE 调入UMB
/V 设定在启动SMARTDRIVE的时候,屏幕显示状态信息
/Q 不显示状态信息,但是如果程序执行出错,就会显示
/S 显示附加信息
6. 如何设置Windows默认命令行窗口大小和缓冲区大小
方法一:使用mode命令
查看一下mode的用法:mode /?
可以得到修改窗口大小的用法是:MODE CON[:] [COLS=c] [LINES=n]
现在把窗口大小从默认的80x40改成120x40:
mode con cols=120 lines=40
但是这样改了以后,就没有缓冲区了,而且开一个新的窗口以后,还是默认的大小
方法二:修改注册表
保存系统默认的 cmd 命令窗口的屏幕缓冲区大小的两个键值分别是:
窗口大小: HKEY_CURRENT_USER\Console\ScreenBufferSize 如果120*40 时值为 002a0078
屏幕缓冲区大小: HKEY_CURRENT_USER\Console\WindowSize 如 120*2000 时值为 07d00078
用下面两条命令来把窗口大小和屏幕缓冲区大小分别改成 120*40 和 120*2000:
reg add "HKEY_CURRENT_USER\Console" /t REG_DWORD /v WindowSize /d 0x002a0078 /f
reg add "HKEY_CURRENT_USER\Console" /t REG_DWORD /v ScreenBufferSize /d 0x07d00078 /f
然后就好了。
7. linux vim的命名缓冲区怎样用
翻译的比较差。书上“缓冲区”这个术语,英文是
register,一般翻译成寄存器。
因为,vi
里还有一个术语是
buffer,通常翻译成缓冲区。所以你在理解书中提的概念后,最好还是习惯用寄存器这个名字。
用法很容易,如果你已经对剪切、复制和粘贴的
d
y
p
等命令熟悉的话,那么在它们前面加上
"x
(一个英文的双引号,即
shift
+
‘
和一个字母
a-z
都可以)。
比如想剪切当前行到寄存器
m。就按:
1 "mdd
一共4个字符。
粘贴的话,用
1"mp
就可以了。
8. c#中有清空缓冲区吗 如果有的话命令是什么 C的是fflush(stdin)
对于初学的C语言中的c,F6应该是清空缓冲区的。
9. 如何关闭 vim 的缓冲区
不清楚你说的关闭vim缓冲区是什么意思。
vim的缓冲区可以进行删除或者清除操作,一般不使用关闭的词。
1、删除vim的缓冲区可以用:bdelete (buffer delete的简写)
2、要清除一个缓冲区,可以使用:bwipe(buffer wipe).
3、删除, ":bdelete" 命令删除了缓冲区以后,Vim 依然记得它。这个缓冲区实际
上成了 "列表外" 缓冲区,它不再出现在 ":buffers" 命令所报告的列表中。 要让
Vim 彻底忘记一个缓冲区,用 ":bwipe" 命令。
10. cmd的缓冲区大小和数量是什么东西想把默认值调大一些,改了之后会出问题吗
这个缓冲区大小的条数是你输入命令后所能记载命令的条数。
比如你打了51个命令,但图上缓冲区大小是50,那么就有一条命令无法被记录。
正常情况下按键盘的上箭头,就会出现上次打出的命令,这个区域大小就是记录这个命令个数的。
至于缓冲区数量,这个就不知道什么意思了。