Linux Day11---mbash项目(二)
观看本文之前请先阅读Linux Day10的相关内容
1.touch
1.1 open系统调用
int open(const char*path,int oflags,mode_t mode);
oflags参数:
O_APPEND:把写入数据追加在文件的末尾
O_TRUNC:把文件长度设置为0,丢弃已有的内容
O_CREAT:如果需要,就按参数mode给出的访问模式创建文件
O_EXCL:与O_CREAT一起使用,确保调用者创建出文件。
mode参数:

1.2 代码实现
所以创建目录文件就可以用ope系统调用
if(strcmp(cmd,"touch")==0){int fdw=open(myargv[1],O_CREAT,S_IRUSR|S_IXOTH);close(fdw);continue;}
2.mv
2.1 文件读取操作
2.1.1 open
详细参考1.1open操作
2.1.2 read
系统调用read的作用是:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它放在数据区buf中,它返回实际读入的字节数,这可能小于请求的字节数,如果read调用返回0,就表示未读入任何数据,已达到文件尾,同样返回-1,表示read调用出现了错误。
size_t read(int fildes,void*buf,size_t nbytes);
2.1.3 write
系统调用write的作用是把缓冲区的前nbytes个字节写入与文件描述符fildes关联的文件中。它返回实际写入的字节数。如果文件描述符有错误或者底层的设备驱动程序对数据长度比较敏感,该返回值可能小于nbytes。如果这个函数返回0,就表示未写入任何数据,如果它返回-1,就是表示write调用中出现了错误,错误的代码保存在全局变量errno里。
size_t wirite(int fildes,const void *buf,size_t nbytes);
2.1.4 remove
remove()函数用于删除指定的文件,其原型如下:
头文件:#include <stdio.h>
int remove(char * filename);
【参数】filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为一目录,则调用rmdir()来处理。
【返回值】成功则返回0,失败则返回-1,错误原因存于errno。
2.1.5 realpath
realpath()库函数对pathname中的所有符合链接一一解引用,从而成功一个以空字符结尾的字符串,内涵相应的绝对路径名:
NAMErealpath - 返回规范化的绝对路径名 SYNOPSIS#include <limits.h>#include <stdlib.h>char *realpath(const char *path, char *resolved_path);
2.1.6 chdir
程序可以像用户在文件系统那样来浏览目录,就像在shell里使用cd命令来切换目录一样,程序使用chdir系统调用;
int chdir(const char*path);
2.2 代码实现
初步思路:这个实现方法比较复杂,我的想法就是因为mv如果后面两个参数在同一个普通文件那么mv命令相当于cp命令,如果不一样,那么就将原先的内容转移到另外一个。
所以我先判断是否在一个文件中,如果在执行cp,如果不在,先将第一个参数的文件位置记录在一个数组中,然后打开第二个参数的文件位置,使用open函数创建一个目录文件,然后将之前打开的参数一的文件内容读出来,算读算写入新创建的目录文件(类似cp)当一切都执行完毕,我们关闭两个文件,然后将路径切换至第一个参数文件位置(这个我们在前面的数组中已经保存了),然后将第一个文件删除即可。
if(strcmp(cmd,"mv")==0){char rp1[128]={0};char rp2[128]={0};realpath(myargv[1], rp1);realpath(myargv[2],rp2);if(strcmp(rp1,rp2)==0){cmd="cp";}else{printf("%s\n",myargv[1]);printf("%s\n",myargv[2]);int fdw1=open(myargv[1],O_RDONLY);char curr_dir[128]={0};if(getcwd(curr_dir,128)==NULL){printf("getcwd err\n");}if(myargv[2]!=NULL){if(chdir(myargv[2])==-1){perror("cd err\n");}int fdw2=open(myargv[1],O_CREAT,S_IRUSR|S_IXOTH);char buff[128]={0};int num=0;while(num=read(fdw1,buff,128)){write(fdw2,buff,num);}close(fdw1);close(fdw2);chdir(curr_dir);}remove(myargv[1]);}continue;}
3.cp
3.1 文件读取操作
3.1.1 open
3.1.2 read
3.1.3 write
3.2 代码实现
if(strcmp(cmd,"cp")==0){char*ptr1=myargv[1];char*ptr2=myargv[2];assert(ptr1!=NULL);int fdw1=open(ptr1,O_RDONLY,0600);int fdw2=open(ptr2,O_CREAT|O_RDWR,0600);char buff[128]={0};int num=0;while(num=read(fdw1,buff,128)){write(fdw2,buff,num);} close(fdw1);close(fdw2);continue;}
4.cat
4.1 文件读取操作
4.1.1 open
详细参考1.1open操作
4.1.2 read
4.1.3 write
4.2 代码实现
所以cat实现起来就变得简单多了,我们先将文件读出来,存进一个字符数组(这里我们用定长的数组,所以cat文字有限),然后遍历字符数组即可
if(strcmp(cmd,"cat")==0){int fdw=open(myargv[1],O_RDONLY,0600);if(fdw<0){printf("fopen err\n");continue;}char buff[256]={0};int num=0;int i=0;while(num=read(fdw,buff,256)){for(int i=0;i<num;i++){printf("%c",buff[i]);fflush(stdout);}}continue;}
5.ls
int main(int argc ,char *argv[])
{char buff[128] = {0};if(strncnp("." ,argv[1],1)== || strncmp ("/" ,argv[1],1)==)strcpy(buff ,argv[1]);elseif(getcwd(buff, 128)==NULL) exit(1);DIR* pdir = opendir(buff);if(pdir-=NULL) exit(1);struct dirent* s = NULL ;while( (s=readdir(pdir))!=NULL){if(strncmp(argv[1],"-a" ,2)==0){struct stat filestat;stat(s->d_ nane ,&fllestat);if(S_ ISDIR(filestat.st mode))printf(" 1033[1;34nxs\033[0m" ,S->d nane);elseif(filestat.st_ mode & (S_ IXUSR|S_ IXGRPIS. IXOTH))printf(" 1033[1;32mxs\033[0m",S-xd nane);elseprintf("%s", s->d name);}else if(strncmp(argv[1],"-i" ,2)==0) {if(strncmp("." s->d nane ,1)==) continue;struct stat filestat; stat(s->d_ nane ,&fLestat);if(5_ ISDIR(filestat.st mode))printf("%ld 1033[1;34m%s\033[0m" ,5->d ino,s->d nane);elseif(filestat.st_ mode & (S_ IXUSRIS_ IXGRPIS_ IXOTH)){printf("%ld \033[1;327m%s\033[0m" ,s->d. _ino,s->d_ nane);else printf("%ld %s ",s->d_ ino,S->d nane);}else if(strncmp(argv[1],"-l" ,2)==0) {if(strncmp(".",s->d nane,1)==0) continue;}else{if(strncmp("." ,S->d nane,1)--0) continue;struct stat filestat;stat(s->d nane ,&fiLestat);if(s_ISDIR(filestat.st mode))printf(" \033[1;34m%s\033[@m” ,s->d. nane);elseif(filestat.st mode & (S_ IXUSRIS IXGRPIS IXOTH))printf(”\033[1;32m%s\033[0m” ,s->d. nane);else printf("%s " ,s->d nane);}}printf("\n");closedir(pdir);exit(0);
}
好了,这里mbash实现的差不多,只不过各个命令的实现还是比较复杂,等过段时间将这些方式再优化优化,找到最优解。
相关文章:
Linux Day11---mbash项目(二)
观看本文之前请先阅读Linux Day10的相关内容 1.touch 1.1 open系统调用 int open(const char*path,int oflags,mode_t mode); oflags参数: O_APPEND:把写入数据追加在文件的末尾 O_TRUNC:把文件长度设置为0,丢弃已有的内容 O_CREAT:如果需要&#…...
回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图…...
【Golang】go条件编译
交叉编译只是为了能在一个平台上编译出其他平台可运行的程序,Go 作为一个跨平台的语言,它提供的类库势必也是跨平台的,比如说程序的系统调用相关的功能,能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译…...
学习创建第一个 React 项目
目标 本篇的目标是配置好基础的环境并创建出第一个 React 项目。 由于之前没接触过相关的知识,所以还需要了解其依赖的一些概念。 步骤主要参考First React app using create-react-app | VS code | npx | npm - YouTube 0. 简单了解相关概念 JavaScript 一种语…...
使用Python构建网络爬虫:提取网页内容和图片资源
网络爬虫是一种自动获取网页内容的程序,它可以帮助我们高效地收集网络上的有价值信息。本文将介绍如何使用Python构建网络爬虫,提取网页内容和图片资源。 一、环境准备 1.安装Python环境 首先,确保您已经安装了Python环境。访问P…...
推荐两款开源的绘制流程图软件
一句话导读 目前流程图绘制软件非常多,包括本机安装的、web端的都有,如Visio、Graphviz、processOn等等。但是几乎都是收费的。本文给大家介绍两款优秀的开源免费的流程图绘制软件。 目录 一句话导读 一、draw.io 二、Meta2d.js 1.为什么使用 2.…...
echarts画一个简单的饼图 中间是空的 环有两种颜色一种是底色 一种是百分比的颜色
//dom打印出来大概是什么样子下方有个图可以作为参考 ecInit(correctRate, processAnalysisVO.correctRate, (100-processAnalysisVO.correctRate));//如效果图//饼图 function ecInit(dom, correctRate, errorRate) {var dom dom; //就是你要放入的盒子元素var myChart ech…...
5 群起集群
1.在启动集群之前,先配置workers,有几个节点就配置几个 [atguiguhadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers在该文件中增加如下内容: hadoop102 hadoop103 hadoop104 注意:该文件中添加的内容结尾不允许有空格&a…...
前端传参对象套对象的格式,后端进行解析并存入数据库
项目场景: 在一些小程序中会涉及到一个表单中的一个数组对象中夹杂着另一个对象数据,这个被夹杂的数据是from表单内的一组单选或者双选这样的数据,前端转为json对象之后传到后端进行解析 问题描述 首先传进来的对象是这样的格式的 abc:{"a":"0&quo…...
WordPress 网站使用 CDN 后获取访客真实 IP
WordPress 往数据库存 IP 的时候似乎用的是 REMOTE_ADDR,这样一来数据库里面的评论信息就全是从各个 CDN 服务器来的 IP。 在 wp-config.php 文件中增加下面代码就可以获取 CDN 后访客的真实 IP。这个函数的核心是用解析后的 HTTP_X_FORWARDED_FOR 替换 REMOTE_ADD…...
mysql my.ini、登录、用户相关操作、密码管理、权限管理、权限表,角色管理
my.ini 配置文件格式 登录mysql mysql -h hostname | IP -P port -u username -p database -e “select 语句”; 创建用户、修改用户、删除用户 create user ‘zen’ identified by ‘密码’ ## host 默认是 % create user ‘zen’‘localhost’ identified by ‘密…...
UUID和数据库主键
UUID uuid是由网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等因素随机生成的一个字符串。有128位,重合概率是2的128次方。 Unique 突发奇想用uuid做数据库主键。 可以保证全局唯一性可以分布式生成无序插入可以避免锁…...
uniapp:蓝牙模块
模拟的是蓝牙设备签到/签出: 获取指定蓝牙设备蓝牙初始搜索次数限制,超过限制就停止搜索蓝牙连接失败次数限制,超过限制标识蓝牙连接失败(离开蓝牙范围或其他原因)自动重连指定蓝牙 const device ref<any>(nu…...
探索链表:数据结构的精妙之处
前言 在计算机科学中,数据结构是构建和组织数据的基础,它们是解决复杂问题的关键。然而,在众多数据结构中,链表(Linked List)因其独特的特点和广泛的应用而备受关注。本文将带您深入探讨链表的概念、种类、…...
Java监听mysql的binlog 报错解决办法
报错:com.github.shyiko.mysql.binlog.network.AuthenticationException: Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方案:在mysql中执行以下命令 alter user rootlocalhost identi…...
Javascript 中的 debugger 拦截
debugger 指令,一般用于调试,在如浏览器调试执行环境中,可以在 JavaScript 代码中产生中断。 如果想要拦截 debugger,是不容易的,常用的函数替代、proxy 方法均对它无效,如: window.debugger …...
深入Golang之Mutex
深入Golang之Mutex 基本使用方法 可以限制临界区只能同时由一个线程持有。 直接在流程结构中使用 lock、unlock嵌入到结构中,然后通过结构体的 mutex 属性 调用 lock、unlock嵌入到结构体中,但是是直接在需要锁定的资源方法中使用,让外界无…...
高并发内存池项目(C++实战项目)
项目介绍 项目来源 本项目实现了一个高并发内存池,参考了Google的开源项目tcmalloc实现的简易版;其功能就是实现高效的多线程内存管理。由功能可知,高并发指的是高效的多线程,而内存池则是实现内存管理的。 tcmalloc源码 ▶项…...
G. The Morning Star - 思维
分析: 直接暴力就会tle,不知道怎么下手,可以统计八个方向一条线上的所有坐标,这些坐标一定可以放在一起满足,分析都有哪些线,当横坐标相同时会有竖着的一条线都可以,也就是x c,当纵…...
应急物资管理系统|智物资DW-S300提升应急响应能力
项目背景 智慧应急物资管理系统(智装备DW-S300)是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本项目采用东识智慧应急物资管理…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
