Linux基础 关于缓冲区和cp、who的指令实现

本文介绍了Linux中非内核缓冲区的原理及其在提高文件读写效率上的作用。通过使用缓冲区,可以减少用户态与内核态之间的切换,从而提升执行效率。以`cp`指令为例,详细解析了如何在C语言中实现这一优化,包括打开文件、读取源文件、写入目标文件及关闭文件等步骤。强调了在编写自定义指令时查阅手册和正确放置执行文件路径的重要性。
摘要由CSDN通过智能技术生成

关于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下才能当作默认指令进行执行;

从代码片段可以看得出来,本次读写都是根据缓冲区进行,并不是直接针对单个字符进行读写;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值