关于linux非内核缓冲区的原理:
这里只简述非内核缓冲区的相关问题;
之前使用的编写的who指令只是简单的调用了基本的读写函数,并没有对缓冲区进行使用,所以会使得执行效率很慢;
之前接触过OS的概念,之所以慢本质上就是当访问文件调用系统调用的时候,需要进行用户-内核态的切换,从而导致时间浪费;
如果设置一个足够大的缓冲区,则可以一次切换读写多次内容,从而减少状态切换,使得时间浪费减少,所以这也是非内核缓冲区的最大优点;
使用缓冲区的CP指令编写:
cp指令是linux常用指令之一,目的是将一个文件覆盖到另一文件,如果不存在,就直接创建;
所以基本流程:
1.打开源文件;
2.打开要写的文件;
3.从源文件读到缓冲区;
4.从缓冲区写入;
5.循环直至文件写入完毕,关闭两个文件;
具体代码参考如下:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#define buffsize 4069
#define copymode 0644
void opps(char *s1,char *s2){
fprintf(stderr,"Error:%s",s1);
perror(s2);
exit(1);
}
int main(int ac,char *av[]){
int in_fd;
int out_fd;
int n_chars;
char buf[buffsize];
if(ac!=3){
fprintf(stderr,"usage: %s source destination\n",*av);
exit(1);
}
if((in_fd=open(av[1],O_RDONLY))==-1){
opps("Cannot open",av[1]);
}
if((out_fd=open(av[2],O_RDWR|O_CREAT|O_TRUNC,0777))==-1){
opps("Cannot create",av[2]);
}
while((n_chars=read(in_fd,buf,buffsize))>0){
//if still have context to read;
if(write(out_fd,buf,buffsize)!=n_chars){
opps("write error to",av[2]);
}
}
if(n_chars==-1){
opps("Read error from",av[1]);
}
if(close(in_fd)==-1||close(out_fd)==-1){
opps("error closing","");
}
}
这里值得注意的有两点:
1.对于相应函数查手册;
2.对于自建指令要放在/usr/bin下才能当作默认指令进行执行;
从代码片段可以看得出来,本次读写都是根据缓冲区进行,并不是直接针对单个字符进行读写;