首页 > 编程知识 正文

linux查看系统空间使用情况,linux查看空间使用情况

时间:2023-05-03 11:08:24 阅读:120067 作者:3649

一)缓冲机制

根据APP应用程序访问文件的方式,即是否存在缓冲区,对文件的访问可以分为带缓冲区的操作和非缓冲区的操作。

缓冲文件操作:高级文件系统。 自动为用户空间中正在使用的文件创建内存缓冲区。

非缓冲区文件系统:低级文件系统。 如果需要,用户只能通过自己的程序为每个文件设置缓冲区。

在未缓存的文件访问方法中,每次对文件执行读写操作时,都需要使用读写文件系统处理该操作,因此如果用户需要访问磁盘文件,每次访问时都会执行系统调用执行系统调用时,会从用户区域切换到内核区域,并切换上下文,从而浪费了CPU时间,频繁的磁盘访问会严重影响程序的执行效率

ANSI标准c库函数构建在使用低级文件I/O系统调用实现c函数库文件访问函数的基础上。 ANSI标准c库中的文件处理函数在某些APP应用程序中采用缓冲机制,以减少系统调用的使用次数并提高效率。 这样,在对磁盘文件进行读取操作时,可以一次将大量数据读取到缓冲区中,今后不再需要使用系统进行这种访问。在写入文件时,首先将内容保存在缓冲区中,文件已满(2)缓冲类型标准I/O备有3种缓冲区。 )完整缓冲区)此缓冲区必须填满整个缓冲区,然后才能进行I/O系统调用操作。 通常使用完整缓冲区访问磁盘文件。 第一次执行I/O操作时,ANSI标准文件管理函数调用malloc函数以获取要使用的缓冲区。 默认大小为8192。 //come from/usr/include/stdio.h/* default buffer size.*/# ifndef bufsiz # define bufsiz _ io _ bufsiz///bufsiz include/_ g _ config.h # define _ g _ bufsiz 8192//真正的大小刷新(当缓冲区已满时,或函数fflush ()或flush

2、行缓冲器:在这种情况下,输入输出过程中发生换行代码时,标准I/O库执行I/O系统调用。 当流与一个终端相关联时,使用例如标准输入、标准输出和低缓冲器。 标准I/O库收集的每一行的缓冲区长度是固定的,因此当缓冲区已满时,即使尚未发生换行符,也会执行I/O系统调用。 缺省行缓冲区的大小为128字节。

3、无缓冲区:标准I/O库不缓存字符。 如果使用标准I/O函数在没有缓冲区的流中写入一些字符,这等效于使用write系统调用函数在相关的打开文件中写入字符。 标准错误流stderr通常没有缓冲区,因此可以快速显示错误消息。 对于标准输入/输出设备,ANSIC必须具有l标准输入设备和标准输出设备的缓冲特性。 只有在没有交互设备参与时,标准输入流和标准输出流才是完整缓冲区。 l标准错误输出设备:标准错误绝不是全缓冲区。 对于任何流,都可以调用setbuf (和setvbuf )函数来更改缓冲区类型。 1、

名称:

三足动物

功能:

更改文件流缓冲区的位置

头文件:

#inlcude

函数原形:

void setbuf (文件* restrictstream,char* restrict buf )。

参数:

流操作的流对象

buf指定的缓冲区

返回值:

成功则返回0,有错误则不为0

此函数的第一个参数必须是要操作的流对象,第二个参数buf必须指向长度为BUFSIZ的缓冲区。 如果将buf设置为NULL,则将关闭缓冲区。 如果执行成功,则返回0,否则返回非零值。

2,

名称:

setvbuf

功能:

更改文件流缓冲区的位置

头文件:

#inlcude

函数原形:

(int setvbuf (文件* restrictstream,char*restrict buf,int modes,size_t n ) ) ) ) ) ) ) )

参数:

流操作的流对象

buf指定的缓冲区

mode缓冲区类型

nbuf的大小

返回值:

成功则返回0,有错误则不为0

/* makestreamusebufferingmodemode.ifbufisnotnull,useNbytesofitforbuffering; elseallocateaninternalbuffernbyteslong.* /此函数的第一个参数是操作对象

流对象;第二个参数 buf必须指向一个长度为BUFSIZ的缓冲区;第三个参数为缓冲区类型,分别定义如下://come from /usr/include/stdio.h/* The possibilities for the third argument to 'setvbuf'. */#define _IOFBF 0 /* Fully buffered. */ //全缓冲#define _IOLBF 1 /* Line buffered. */ //行缓冲#define _IONBF 2 /* No buffering. */ //无缓冲第四个参数

为该 buf的大小。如果指定一个不带缓冲区的流,则忽略buf和size参数。如果指定全缓冲区或行缓冲区,则 buf和size可选择地指定一个缓冲区及其长度。如果指定该流是带缓冲区的,而buf是NULL,则标准I/O库将自动为该流分配适当长度的缓冲适当长度指的是由文件属性数据结构(struct stat)的成员st_blksize所指定的值,如果系统不能为该流决定此值(例如若此流涉及一个设备或一个管道),则分配长度为BUFSIZ的缓冲区。此函数如果执行成功,将返回 0,否则返回非0值。以下是一个修改 buf大小写文件的实例程序。其源代码如下:

int main( int argc , char ** argv ) { int i; FILE * fp; char msg1[]="hello,wolrd/n"; char msg2[] = "hello/nworld"; char buf[128]; /*打开(或者创建)一个文件,然后使用 setbuf 设置为 nobuf 情况,并检查关闭前流的情况*/ if(( fp = fopen("no_buf1.txt","w")) == NULL) { perror("file open failure!"); return(-1); } setbuf(fp,NULL); //设置为无 buf fwrite( msg1 , 7 , 1 , fp ); //写内容 printf("test setbuf(no buf)!check no_buf1.txt/n"); //查看 buf 情况 printf("press enter to continue!/n"); getchar(); fclose(fp); //关闭流,因此将回写 buf(如果有 buf 的话) /打开(或者创建)一个文件,然后使用 setvbuf 设置为 nobuf 情况,并检查关闭前流的情况*/ if(( fp = fopen("no_buf2.txt","w")) == NULL) { perror("file open failure!"); return(-1); } setvbuf( fp , NULL, _IONBF , 0 ); //设置为无 buf fwrite( msg1 , 7, 1 , fp ); //写内容 printf("test setvbuf(no buf)!check no_buf2.txt/nbecause line buf, only before enter data write/n"); printf("press enter to continue!/n"); getchar(); fclose(fp); //关闭流,因此将回写 buf(如果有 buf 的话) /*打开(或者创建)一个文件,然后使用 setvbuf 设置为行 buf 情况,并检查关闭前流的情况*/ if(( fp = fopen("l_buf.txt","w")) == NULL) { perror("file open failure!"); return(-1); } setvbuf( fp , buf , _IOLBF , sizeof(buf) );//设置为行 buf fwrite( msg2 , sizeof(msg2) , 1 , fp ); //写内容 printf("test setvbuf(line buf)!check l_buf.txt, because line buf , only data before enter send to file/n"); printf("press enter to continue!/n"); getchar(); fclose(fp); //关闭流,因此将回写 buf //打开(或者创建)一个文件,然后使用 setvbuf 设置为全 buf 情况,并检查关闭前流的情况 if(( fp = fopen("f_buf.txt","w")) == NULL) { perror("file open failure!"); return(-1); } setvbuf( fp , buf , _IOFBF , sizeof(buf) ); for(i = 0 ; i { fputs( msg1 , fp ); } printf("test setbuf(full buf)!check f_buf.txt/n"); printf("press enter to continue!/n"); getchar(); fclose(fp); //关闭流,因此将回写 buf }

其编译过程及运行结果如下:[root@localhost linux_app]# ./setbuf_exampletest setbuf(no buf)!check no_buf1.txt//在按回车键前需要先查看当前目录下的no_buf1.txt内容press enter to continue!

test setvbuf(no buf)!check no_buf2.txt//在按回车键前需要先查看当前目录下的no_buf2.txt内容because line buf, only before enter data writepress enter to continue!

test setvbuf(line buf)!check l_buf.txt, because line buf ,only data before enter send to filepress enter to continue! //在按回车键前需要先查看当前目录下的l_buf.txt内容

test setbuf(full buf)!check f_buf.txtpress enter to continue! //在按回车键前需要先查看当前目录下的f_buf.txt内容以下内容是在过程中查看各文件内容信息:[root@localhost linux_app]# cat no_buf1.txthello,w //写入的7个字符全部写入到文件中[root@localhost linux_app]# cat no_buf2.txthello,w //写入的7个字符全部写入到文件中[root@localhost linux_app]# cat l_buf.txthello //只有回车前的字符写入[root@localhost linux_app]# cat f_buf.txt //没有任何内容写入运行过程完成后:[root@localhost linux_app]# cat no_buf1.txthello,w //与原来内容一样[root@localhost linux_app]# cat no_buf2.txthello,w //与原来内容一样[root@localhost linux_app]# cat l_buf.txthelloworld //因为调用了fclose()函数,刷新了缓冲区,将world写入[root@localhost linux_app]# cat f_buf.txthelloworld //因为调用了fclose()函数,刷新了缓冲区,将hello/nworld都写入

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。