Linux Day11---mbash项目(二)

news2024/11/26 9:41:46

观看本文之前请先阅读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中的所有符合链接一一解引用,从而成功一个以空字符结尾的字符串,内涵相应的绝对路径名:

NAME
       realpath - 返回规范化的绝对路径名 

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]);
	else
	if(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);
			else
				if(filestat.st_ mode & (S_ IXUSR|S_ IXGRPIS. IXOTH))
					printf(" 1033[1;32mxs\033[0m",S-xd nane);
				else
					printf("%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);
			else
				if(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);
			else
				if(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实现的差不多,只不过各个命令的实现还是比较复杂,等过段时间将这些方式再优化优化,找到最优解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle数据库sqlplus命令行执行sql语句时,语句有中文报错解决

在Oracle数据库sqlplus命令行执行sql语句时&#xff0c;语句有中文报错解决 -- 建表语句 create table T_ADEV_SCLG_YXDXMB (obj_id VARCHAR2(42) not null,xmmc VARCHAR2(400),xmbh VARCHAR2(100),jhnd INTEGER,gsmc VARCHAR2(50),xmssdwmc VARCHAR2…

如何从用户视角搭建可观测体系?阿里云ECS业务团队的设计思路

一分钟精华速览 互联网平台以业务为中心&#xff0c;以用户为中心&#xff0c;平台的功能服务、质量和用户体验等是关键的目标&#xff0c;仅仅关注后台系统的可用性是不够的&#xff0c;以传统运维的视角来解决故障、做监控会比较被动。 本文以阿里云 ECS 业务为例&#xff…

医院设备电力中断?如何改善UPS系统?教你一招

当今医疗体系紧密依赖于电力供应的稳定性&#xff0c;以保障医疗设备的正常运行和患者的安全。然而&#xff0c;电力中断或波动可能会带来严重的风险&#xff0c;因此&#xff0c;不间断电源&#xff08;UPS&#xff09;系统在医院中扮演着至关重要的角色。 为确保UPS系统的高效…

Java在项目中覆盖Jar包中的类

import cn.hutool.core.util.StrUtil;public class CoverJarTest {public static void main(String[] args) {System.out.println(StrUtil.toString("1"));} }输出1 我们将hutool的包名在我们的项目中创建一个&#xff0c;并且将对应类的源码复制一份过来&#xff0c…

Echarts图表坐标轴文字太长,省略显示,鼠标放上显示全部(vue)

注意&#xff1a;记得加上这个&#xff0c;触发事件&#xff0c; triggerEvent: true,重点&#xff1a;下面就是处理函数&#xff0c;在实例化图表的时候使用&#xff0c;传入参数是echarts的实例 // 渲染echartsfirstBarChart() {const that thislet columnar echarts.init…

Typecho博客搭建 实现公网访问内网站点

文章目录 前言1. 环境安装2.安装Typecho3.安装cpolar内网穿透4. 固定公网地址5.配置Typecho 前言 Typecho是一款PHP语言编写的开源博客程序&#xff0c;它是一个轻量级的内容管理系统&#xff0c;专注于博客领域。支持多用户、多站点、多语言等功能&#xff0c;可以满足不同用…

多模态(文本、图片)数据融合模型(含公开数据集、文献及开源代码汇总)

多模态&#xff08;文本、图片&#xff09;数据融合模型&#xff08;含公开数据集、文献及开源代码汇总&#xff09; <center>多模态模型的应用跑代码普遍存在的问题 <center>多模态公开数据集<center>文献及开源代码 多模态模型的应用 多模态模型的应用按照…

zabbix3.4配置客户端

1.安装agent yum -y install zabbix zabbix-agent如果下载不动或者无外网环境请看 https://download.csdn.net/download/qq_45748758/88228235?spm1001.2014.3001.5501 免费自取 2、配置zabbix-agent&#xff0c;修改图片三个参数 vi /etc/zabbix/zabbix_agentd.conf3、启动…

WebDAV之葫芦儿·派盘+柚子记账

柚子记账是一个手机记账的软件,这个软件主要是给那些懒人进行设计的,这里有很多关于记账的模板可以让你直接在线使用,你只需要导入相关的数据就可以了,整个操作是非常简单的,而且你也可以进行自定义的图表制作,生成你自己的记账模式。每当你记完之后,系统都会自动给你总…

【excel密码】加密excel工作表的3种方法

Excel文件经常用于处理数据文件&#xff0c;在完成编辑之后&#xff0c;对文件进行加密可以更好的保护数据&#xff0c;今天分享加密excel工作表的3种方法。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了…

档案馆库房温湿度监控系统技术性【解决方案】

档案存储环境会受诸多因素的影响,其中最为主要的因素就是档案库房的温度与湿度。其中&#xff0c;库房的温度指得是档案库房内大气的冷热程度&#xff1b;湿度是指库房大气中的水分含量。保持档案库房内环境恒温恒湿,不仅可以保障档案的保存质量&#xff0c;而且可以延长档案保…

linux中模拟RTOS中事件集

linux中通常如何处理事件集 在Linux中&#xff0c;没有直接对应于实时操作系统&#xff08;RTOS&#xff09;中事件集&#xff08;Event Set&#xff09;的概念。实时操作系统通常提供了一种机制&#xff0c;允许任务或线程根据事件的发生状态进行等待和唤醒。这通常通过信号量…

CW2B-3A-T、CW2B-6A-T、CW2B-10A-T插座式滤波器

CW2B-3A-T、CW2B-6A-T、CW2B-10A-T CW2B-3A-T(001)、CW2B-6A-T(001)、CW2B-10A-T(001) CW2B-3A-T(002)、CW2B-6A-T(002)、CW2B-10A-T(002) CW2B-3A-T(003)、CW2B-6A-T(003)、CW2B-10A-T(003) CW1D-3A-T、CW1D-6A-T、CW1D-10A-T CW2B-3A-T(004)、CW2B-6A-T(004)、CW2B-10A-…

基于ssm vue智慧城市实验室主页系统源码和论文

基于ssm vue智慧城市实验室主页系统源码和论文059 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方…

【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~

Maven基础使用篇 1️⃣ 编写 POM2️⃣ 编写业务代码3️⃣ 编写测试代码4️⃣ 打包和运行5️⃣ 使用 Archetype生成项目骨架 1️⃣ 编写 POM 到目前为止&#xff0c;已经大概了解并安装好了Maven环境, 现在&#xff0c;我们开始创建一个最简单的 Hello World 项目。如果你是初次…

使用Selenium爬取动态表格中的多语言和编码格式

正文 Selenium是一个用于自动化Web浏览器的工具&#xff0c;它可以模拟用户的操作&#xff0c;如点击、输入、滚动等。Selenium也可以用于爬取网页中的数据&#xff0c;特别是对于那些动态生成的内容&#xff0c;如表格、图表、下拉菜单等。本文将介绍如何使用Selenium Python…

Jmeter 如何才能做好接口测试?

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01; 所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几…

JZ36 二叉搜索树与双向链表

问题描述&#xff1a; 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。 问题要求&#xff1a; 1.要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。当转化完成以后&#xff0c;树中节点的左指 针需要指向前驱&#xff0c;树中节点…

“MyBatis进阶:分页与特殊字符处理“

目录 引言1. MyBatis的分页1.1 分页原理1.2 使用插件实现分页 2. MyBatis中特殊字符处理2.1 特殊字符的问题2.2 使用转义字符 总结 引言 在使用MyBatis进行数据库操作时&#xff0c;我们经常会遇到一些高级的需求&#xff0c;例如分页查询和特殊字符处理。本文将深入探讨如何在…

面试题(二)

目录 一.集合 (1) LinkedHashMap(JDK 1.8) (2) ArrayList (3) HashMap (4) ConcurrentHashMap 二. IO流 (1) 分类 (2) 应用 三.多线程 (1) 线程状态 (2) 死锁 (3) 应用 (4) 要点 (5) 线程池 返回 ThreadPoolExecutor 类分析 线程池原理分析 四. 数据库 (1) …