Linux下minishell项目的编写

项目目标

1.编写函数打印初始界面以及显示输入的命令(由于程序一直执行,需要在循环内执行)

2.编写接收用户输入的命令的函数

3.编写使命令与功能匹配的函数

4.将界面输入的字符串分割为命令以及传入函数的数据

5.完成minishell的基本功能函数:

        ls  :显示目录下文件(不包括隐藏文件) 

        ls -a :显示所有文件         

        touch   :创建一个文件
        rm:移除一个文件
        mkdir :创建一个目录
        rmdir:移除一个目录
        cd :切换目录
        cp:拷贝文件
        mv:移动文件内容
        pwd:显示当前目录
        cat:显示文件内容
        chmod  :改变文件权限
        ln:创造文件链接

2.5.(补充任务)将输入的命令写入时间日志

6.将不同文件下的函数建立关联

7.将函数进行封装

目标一的实现:

使用printf函数打印出基础界面,再用getcwd获得本地目录的值,由于值过于长,因此通过while以及if的判断,将打印出来的内容只显示最后一个子目录

其实现子函数如下:

int show(void)
{char tmp[1024]={0};char *ptm=NULL;getcwd(tmp,sizeof(tmp));ptm=tmp;while(*ptm !='\0'){ptm++;}while(*ptm !='/'){ptm--;}if(strcmp(tmp,"/")!=0){ptm++;}printf("[linux@ubuntu:%s]",ptm);
}

目标二的实现:

在主函数中设置一个数组,将其传输到目标二的函数中,用fgets函数将界面上输入的值写入数组中(用stdin),并在数组的最后一项补充‘\0’-----作用为:在目标三中使匹配能够完成。

//主函数中定义数组pcmd(maxlen);
int getuse(char *pcmd,int maxlen)
{fgets(pcmd,maxlen,stdin);pcmd[strlen(pcmd)-1]='\0';
}

目标三与四的实现:

将目标二中的数组与预设的命令符号通过strncmp对比,若符合,通过strtok函数对数组中的字符串按空格进行切割,在分别用指针保存切割后的指令,一般第一个指令为命令,后面的指令为输入参数。

int str(char *cmd)
{
if(!strcmp(cmd,"exit")){break;}if(!strncmp(cmd,"cd",2)){char *token=strtok(cmd," ");token =strtok(NULL," ");cd(token);}if(!strncmp(cmd,"cp",2)){char *age=NULL;char *agv=NULL;char *token=strtok(cmd," ");age =strtok(NULL," ");agv =strtok(NULL," ");cp(age,agv);}if(!strncmp(cmd,"chmod",5)){char *age=NULL;char *agv=NULL;char *token=strtok(cmd," ");age =strtok(NULL," ");agv =strtok(NULL," ");mychmod(age,agv);}if(!strncmp(cmd,"ls-l",4)){char *token=strtok(cmd," ");token =strtok(NULL," ");lsl(token);}if(!strcmp(cmd,"ls")){ls();}if(!strncmp(cmd,"ls-a",4)){lsa();}if(!strncmp(cmd,"mkdir",5)){char *token=strtok(cmd," ");token =strtok(NULL," ");mymkdir(token);}if(!strncmp(cmd,"rmdir",5)){char *token=strtok(cmd," ");token =strtok(NULL," ");myrmdir(token);}if(!strncmp(cmd,"ln",2)){char *age=NULL;char *agv=NULL;char *token=strtok(cmd," ");age=strtok(NULL," ");agv=strtok(NULL," ");ln(age,agv);}if(!strncmp(cmd,"mv",2)){char *age=NULL;char *agv=NULL;char *token=strtok(cmd," ");age =strtok(NULL," ");agv =strtok(NULL," ");mv(age,agv);}if(!strncmp(cmd,"touch",5)){char *token=strtok(cmd," ");token =strtok(NULL," ");touch(token);}if(!strncmp(cmd,"cat",3)){char *token=strtok(cmd," ");token =strtok(NULL," ");cat(token);}if(!strncmp(cmd,"rm",2)){char *token=strtok(cmd," ");token =strtok(NULL," ");rm(token);}if(!strcmp(cmd,"pwd")){pwd();}
}

目标五的实现

按照ubantu的shell中的基本功能函数编写函数:

ls功能:先使用getcwd函数获得目录地址,用opendir打开目录,并通过readdir读取目录,当读取到空时停止读取,读取到隐藏目录时,跳过,并将读取到的目录打印出来

#include"head.h"
int ls(void)
{char *a=NULL;DIR *b=NULL;struct dirent *c=NULL;char *ml=NULL;a=getcwd(ml,256);b=opendir(a);while(1){c=readdir(b);if(NULL==c){break;}if('.'==c->d_name[0]){continue;}printf(" %s ",c->d_name);}printf("\n");return 0;
}

ls -a功能:将ls的功能删减跳过隐藏文件即可

touch功能:使用fopen函数,打开方式为w即可

#include"head.h"
int touch(char *agv)
{FILE *a=NULL;char *p=NULL;p=agv;a=fopen(p,"w");fclose(a);
}

rm功能:使用remove函数

mkdir功能 :使用mkdir函数

rmdir:使用rmdir函数

cd :使用chdir函数

mv:使用rename函数

pwd:使用getcwd函数获得目录并打印       

ln:使用link函数链接ab文件

 cat:使用r方式打开文件,并将内容存到数组中,使用fputc函数将数组内容打印到终端上

#include"head.h"
int cat(char *q)
{FILE *tmp=NULL;char d;tmp=fopen(q,"r");while(1){d=fgetc(tmp);fputc(d,stdout);if(d==EOF){break;}}printf("\n");
}

 chmod  :先将从终端输入的字符型数字改变为八进制数字(strtol函数),然后使用chmod函数

#include"head.h"
int mychmod(char *age,char *agv)
{mode_t mode =0;mode =strtol(agv,NULL,8);printf("%d",mode);chmod(age,mode);
}

 cp:将传入的文件用r打开并存到数组中,用w打开传入的目标文件,用fgetc得到数组中的内容,用fputc写入目标文件即可

#include"head.h"
int cp(char *age,char *agv)
{FILE *tmp=NULL;FILE *aim=NULL;char *a=NULL;char *b=NULL;a=age;b=agv;char c[4096]={0};char d;tmp=fopen(a,"r");aim=fopen(b,"w");while(1){d=fgetc(tmp);fputc(d,aim);if(d==EOF){break;}}
}

目标六的实现

1.创造一个包含目标5实现的函数的声明的头文件,并包括各个函数所需的头文件

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<dirent.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#include<stdlib.h>
#include<string.h>
extern int ls(void);
extern int lsa(void);
extern int lsl(const char *agv);
extern int touch(char *agv);
extern int rm(char *agv);
extern int mymkdir(char *agv);
extern int myrmdir(char *agv);
extern int cd(char *agv);
extern int cp(char *age,char *agv);
extern int mv(char *age,char *agv);
extern int pwd(void);
extern int mychmod(char *age,char *agv);
extern int cat(char *q);
extern int ln(char *age,char *agv);#endif

2.使用Makefile将所有有关文件关联并用make一起编译

OBJ=a.out
OBJT=main.c touch.c cd.c ls-l.c ls.c ls-a.c mkdir.c rmdir.c cat.c rm.c pwd.c cp.c mv.c ln.c chmod.c 	$(OBJ):$(OBJT)gcc $^ -o $@

目标七的实现

用tar -zxvf a.out tar.gz 将a.out压缩,a.out即为应用名,运行文件名可以在Makefile中更改,压缩包就是应用包。

附:目标2.5与主函数

目标2.5:在getuse中使用fopen用w打开一个文件,对文件写入存有输入命令的数组以及输入时间。

int getuse(char *pcmd,int maxlen)
{FILE *a=NULL;time_t c;struct tm *d=NULL;fgets(pcmd,maxlen,stdin);pcmd[strlen(pcmd)-1]='\0';time(&c);d =localtime(&c);a=fopen("day.txt","a+");fprintf(a,"[%04d-%02d-%02d %02d:%02d:%02d]\n",d->tm_year+1900,d->tm_mon+1,d->tm_mday,d->tm_hour,d->tm_min,d->tm_sec);fwrite(pcmd,25,1,a);fputc('\n',a);fclose(a);
}

主函数将getuse、show、str包含即可。

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

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

相关文章

【C++】C++对C语言的关系,拓展及命名空间的使用

文章目录 &#x1f4dd;C简述C融合了3种不同的编程方式&#xff1a;C和C语言关系是啥呢&#xff1f;C标准 &#x1f320;C应用&#x1f320;C语言优点第一个C程序 &#x1f320;命名空间&#x1f320;命名空间的使用命名空间的定义 &#x1f320;怎么使用命名空间中的内容呢&am…

测试C#使用ViewFaceCore实现图片中的人脸遮挡

基于ViewFaceCore和DlibDotNet都能实现人脸识别&#xff0c;准备做个遮挡图片中人脸的程序&#xff0c;由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系&#xff0c;最终决定使用ViewFaceCore实现图片中的人脸遮挡。   新建Winform项目&#xff0c;在Nuget包管理器中…

【深度学习】微调ChatGlm3-6b

1.前言 指令微调ChatGlm3-6b。微调教程在github地址中给出&#xff0c;微调环境是Qwen提供的docker镜像为环境。 镜像获取方式&#xff1a;docker pull qwenllm/qwen:cu117 github地址&#xff1a;https://github.com/liucongg/ChatGLM-Finetuning 2.微调过程 github地址中的教…

Excel工作表控件实现滚动按钮效果

实例需求&#xff1a;工作表中有多个Button控件&#xff08;工作表Form控件&#xff09;和一个ScrollBar控件&#xff08;工作表ActiveX控件&#xff0c;名称为ScrollBar2&#xff09;&#xff0c;需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果&#xff0c;实际…

2024.2.25 在centos8.0安装docker

2024.2.25 在centos8.0安装docker 安装过程比较简单&#xff0c;按顺序安装即可&#xff0c;简要步骤&#xff1a; 一、更新已安装的软件包&#xff1a; sudo yum update二、安装所需的软件包&#xff0c;允许 yum 通过 HTTPS 使用存储库&#xff1a; sudo yum install -y …

飞天使-k8s知识点22-kubernetes实操7-ingress

文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;它管理外部访问集群内部服务的规则。你可以将其视为一个入口&#xff0c;它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…

代码随想录算法训练营第六十二天|739. 每日温度 , 496.下一个更大元素 I

通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。 739. 每日温度 代码随想录 class Solution {public int[] dailyTemperatures(int[] temperatures) {Deque<In…

静态时序分析:SDC约束命令set_load详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_load命令用于指定端口(port)或线网(net)的负载电容&#xff0c;该指令的BNF范式&#xff08;有关BNF范式&#xff0c;可以参考以往文章&#xff09;为&#…

LeetCode 刷题|20. 有效的括号,394. 字符串解码

20. 有效的括号 class Solution(object):def isValid(self, s):stack []for x in s:if x (:stack.append())elif x {:stack.append(})elif x [:stack.append(])else:if not stack:return Falseelif stack:a stack.pop()if x ! a:return False if stack:return F…

Java核心-核心类与API(4)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;最后介绍一下Object类以及与数学、日期/时间有关的类&#xff0c;就结束该部分的学习了&#xff0c;其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类…

【数据库】MySQL有几种存储引擎(表类型)?各自有什么区别?

MySQL有几种存储引擎&#xff08;表类型&#xff09;&#xff1f;各自有什么区别&#xff1f; MySQL有几种存储引擎&#xff08;表类型&#xff09;&#xff1f;各自有什么区别&#xff1f;MyISAM&#xff08;1&#xff09;存储组成&#xff08;2&#xff09;MyISAM具有的特点&…

jitsi meet 视频会议录制方案

前言 我们都知道视频会议录制是个很常见的功能&#xff0c;但是由于jitsi meet使用jibri进行录制很耗资源&#xff0c;所以类似腾讯会议这种前端录制&#xff0c;不占用服务器资源&#xff0c;也是一种可选项。 前端录制 前端录制的特点; ●目前此录制仅支持最大 1GB&#…

linux-并发通信

一.linux-tcp通信框架 1.基础框架 1.1 tcp 服务器框架 1.套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol);
 返回的文件描述符可以指向当前的socket&#xff0c;后续通过对文件描述符的访问就可以配置这个socket 成功时返回文件…

nccl2安装指南

https://developer.nvidia.com/nccl/nccl-download 旧版本安装: https://developer.nvidia.com/nccl/nccl-legacy-downloads 找到你对应的CUDA版本 我这里选择 deb 文件安装了 sudo dpkg -i nccl-local-repo-ubuntu2004-2.16.5-cuda11.8_1.0-1_amd64.debsudo cp /var/nccl-lo…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

政安晨:【机器学习基础】(二)—— 评估机器学习模型改进

根据前面我的文章看来&#xff0c;咱们只能控制可以观察到的东西。因为您的目标是开发出能够成功泛化到新数据的模型&#xff0c;所以能够可靠地衡量模型泛化能力是至关重要的&#xff0c;咱们这篇文章将正式介绍评估机器学习模型的各种方法。 政安晨的个人主页&#xff1a;政安…

Hikvision SPON IP网络对讲广播系统命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1.漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视&a…

低功耗设计——门控时钟

1. 前言 芯片功耗组成中&#xff0c;有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟buffer&#xff0c;而且为了最小化时钟延时&#xff0c;它们通常具有很高的驱动强度。此外&…

Leetcode 第 124 场双周赛题解

Leetcode 第 124 场双周赛题解 Leetcode 第 124 场双周赛题解题目1&#xff1a;3038. 相同分数的最大操作数目 I思路代码复杂度分析 题目2&#xff1a;3039. 进行操作使字符串为空思路代码复杂度分析 题目3&#xff1a;3040. 相同分数的最大操作数目 II思路代码复杂度分析 题目…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…