当前位置: 首页 > news >正文

Linux Day10 ---Mybash

目录

一、Mybash介绍

1.1.mybash.c

    打印函数

    分割函数

    命令函数

二、Mybash实现

2.1.打印函数

2.1.1需要使用到的功能函数

1.获取与当前用户关联的UID

2.获取与当前用户的相关信息---一个结构体(passwd)

3.获取主机信息

4.获取当前所处位置

5.给对应字体加颜色

2.1.2 打印函数实现

2.2 分割函数

2.2.1 strtok函数

2.2.2分割函数实现

 2.3 命令函数

2.3.1 exit

2.3.2 clear

 2.3.3 cd

2.3.4 chmod

2.3.5 pwd

2.3.6 mkdir

2.3.7 rmdir

2.3.8 rm

2.3.9 复制、更新进程

三、使用看效果


一、Mybash介绍

1.1.mybash.c

    这个函数用来实现mybash,可分为三大部分:打印函数、分割函数、命令函数

    打印函数

打印出如下的功能
   

能够和bash一样显示出用户+主机名+当前目录+用户身份

    分割函数

将输入的命令按空格分割,并保存到相应的数组中,使用到strtok()字符分割函数。

    命令函数

根据exec系列学习,采用fork+exec,父进程等待,子进程采用exec,调用自己实现的命令文件,进行真实命令的模拟

二、Mybash实现

2.1.打印函数

2.1.1需要使用到的功能函数

1.获取与当前用户关联的UID

uid_t getuid(void);

如果得到是0,就是管理员,初始为普通用户。

2.获取与当前用户的相关信息---一个结构体(passwd)

passwd成员                   说明

char* pw_name           用户登录号

uid_t pw_uid                UID号

gid_t pw_gid                GID号

char* pw_dir                用户家目录

char* pw_gecos          用户全名

char* pw_shell            用户默认shell

 struct passwd*getwuid(uid_t uid);

这里可以定义一个相对应类型的指针ptr去指向该结构体,进而->方式访问到该用户的UID号

3.获取主机信息

int gethostname(char*name,size_t namelen);

gethostname函数把机器的主机名写入到name字符串里,该字符串至少有namelen个字符长。而成功,gethostname的返回0,否则返回-1。

4.获取当前所处位置

char*getcwd(char*buf,size_t size);

getcwd函数把当前目录的名字写入给定的缓冲区-buf,如果目录名长度超出参数size给出的缓冲区长度,就返回NULL,如果成功,返回指针buf。

5.给对应字体加颜色

详细参考printf函数中的/033一系列。

2.1.2 打印函数实现

void print_info()
{uid_t uid=getuid();char*s="$";if(uid==0){s="#";}struct passwd* ptr=getpwuid(uid);if(ptr==NULL){printf("mybash 1.0 $");fflush(stdout);return;}char hostname[128]={0};if(gethostname(hostname,128)==-1){printf("mybash 1.0 $");fflush(stdout);return;}char curr_dir[256]={0};if(getcwd(curr_dir,256)==NULL){printf("mybash 1.0 $");fflush(stdout);return;}printf("\033[1;32m%s@%s\033[0m\033[1;34m:%s\033[0m %s ",ptr->pw_name,hostname,curr_dir,s);fflush(stdout);return;
}

2.2 分割函数

2.2.1 strtok函数

char* strtok(char*str,const char*delim);

str为需要分割的字符串,delim为分割标记。

通常需要循环使用,如果需要多次分割当前字符串,在第二次使用的时候字符串那使用NULL,系统会认为继续对当前字符串进行分割(这里有个指针会指向第一次分割完后的位置)。

2.2.2分割函数实现

char* get_cmd(char buff[],char*myargv[])
{if(buff==NULL||myargv ==NULL){return NULL;}int i=0;char*s=strtok(buff," ");while(s!=NULL){myargv[i++]=s;s=strtok(NULL," ");}return myargv[0];
}

 2.3 命令函数

2.3.1 exit

exit表示退出当前进程。

if(strcmp(cmd,exit)==0){break;}

2.3.2 clear

clear表示清屏,并将光标放置在最上方最左边位置

  \033[2J   清屏  

  \033[y;xH设置光标位置 

    if(strcmp(cmd,"clear")==0){printf("/033[2J]\033[0;0H");}

 2.3.3 cd

首先先说下myargv就是argv,在前面的文里说过int main(int argc,char*argv[],char*envp[]),这里的myargv里面就存储了需要切换到的路径。

其次,程序可以像用户在文件系统里那样来切换目录,就像在shell里面使用cd命令来切换目录一样。程序使用的是chdir系统调用。

int chdir(const char*path);

这里的path存储在myargv[1]里面,myargv[0]为命令cd .

成功返回0,失败返回-1

if(strcmp(cmd,"cd")==0){if(myargv[1]!=NULL){if(chdir(myargv[1])==-1){perror("cd err\n");}}continue;}

2.3.4 chmod

首先先来看看shell里面的chmod

第一个参数为权限设置,第二个参数为需要修改的文件

所以我们通过查看书,可以发现chmod的系统调用

int chmod(const char*path,mode_t mode);

path参数指定的文件被修改为具有mode参数给出的访问权限。

注意我们这里的参数为8进制,所以涉及到参数进制转换。

 if(strcmp(cmd,"chmod")==0){const char*path=myargv[2];int  mode=atoi(myargv[1]);int mode_1=mode/10/10;int mode_3=mode%10;int mode_2=mode/10%10;mode=mode_1*8*8+mode_2*8+mode_3;if(chmod(path,mode)<0){printf("chmod err\n");}continue;}

2.3.5 pwd

getcwd在上面的打印函数中提过,详细请参考上面。

if(strcmp(cmd,"pwd")==0){char cwd[128]={0};if(getcwd(cwd,128)==NULL){printf("pwd err\n");continue;}printf("%s\n",cwd);continue;}

2.3.6 mkdir

mkdir系统调用用于创建目录,他相当于mkdir程序。mkdir调用将参数path作为新建目录的名字。目录的权限由参数mode设定,将含义按open系统调用的O_CREAT选项的有关定义设置。

int mkdir(const char* path,mode_t mode);

注意mode数值的设定。

 if(strcmp(cmd,"mkdir")==0){char* path=myargv[1];mode_t mode=7*8*8+7*8+5;if(mkdir(path,mode)==-1){printf("mkdir err\n");}continue;}

2.3.7 rmdir

rmdir系统调用用于删除目录,但只有在目录为空才行,rmdir程序就是用这个系统调用来完成工作的。

int rmdir(const char*path);

if(strcmp(cmd,"rmdir")==0){char*path=myargv[1];DIR* dir = opendir("path");if(dir == NULL){perror("打开目录失败");exit(1);}struct dirent *ptr = NULL;while((ptr=readdir(dir))!=NULL);if(ptr == NULL){rmdir(myargv[1]);}continue;}

这里我先通过调用opendir和readdir两个函数来判断当前目录是否为空,进而使用rmdir函数来删除当前目录。

opendir函数的作用是打开一个目录并建立一个目录流,成功返回一个指向DIR结构的指针,该指针用于读取目录数据项,失败则返回一个空指针。

DIR*opendir(const char*name);

然后继续使用readdir()函数,返回一个指针,该指针指向结构里面保存着目录流dirp中下一个目录项的有关资源,后续的readdir调用返回后续的目录项,如果错误或者到达目录尾则返回NULL。

因此使用了while循环。

2.3.8 rm

rm可以直接删除普通目录文件,但是不能直接删除普通文件,需要使用到rm -r

因此这里我们需要获取到当前文件的类型

文件的类型存储在struct stat

 

 if(strcmp(cmd,"rm")==0){char*path1=myargv[1];char*path2=myargv[2];struct stat buf;char * ptr;int result;result = stat(myargv[3], &buf);if(S_ISREG(buf.st_mode)){if(strcmp(cmd,strcat(path1,path2))==0){unlink(myargv[3]);}}if(S_ISDIR(buf.st_mode)){rmdir(myargv[3]);}}

如果是普通文件,我们使用unlink系统调用删除一个文件。

unlink系统删除一个文件的目录项并减少他的链接数,它成功返回0失败返回-1.

如果想通过这个函数成功删除文件,你就必须拥有该文件所属目录的写和执行权限。

2.3.9 复制、更新进程

pid_t pid=fork();if(pid==-1){printf("fork err\n");continue;}if(pid==0){execvp(cmd,myargv);printf("exec err\n");exit(0);}wait(NULL);

剩余命令我们后续更新。。。。敬请期待

接下来我们看一下效果

三、使用看效果

 

下次我们更新touch ,mv,cp,ls,cat等命令

 

相关文章:

Linux Day10 ---Mybash

目录 一、Mybash介绍 1.1.mybash.c 打印函数 分割函数 命令函数 二、Mybash实现 2.1.打印函数 2.1.1需要使用到的功能函数 1.获取与当前用户关联的UID 2.获取与当前用户的相关信息---一个结构体&#xff08;passwd&#xff09; 3.获取主机信息 4.获取当前所处位置 5.给…...

Flask-Sockets和Flask-Login联合实现websocket的登录认证功能

flask_login 提供了一个方便的方式来管理用户会话。当你在 Flask 的 HTTP 视图中使用它时&#xff0c;你可以简单地使用 login_required 装饰器来确保用户已登录。 但是&#xff0c;flask_sockets 并没有直接与 flask_login 集成。如果你想在建立 WebSocket 连接时检查用户是否…...

东盟全面覆盖?长城战略部署核心区域市场,首个百万粉丝国产品牌

根据最新消息&#xff0c;长城汽车在东南亚地区取得了巨大的成功&#xff0c;成功进军了亚洲最大的汽车市场之一-印度尼西亚。这标志着长城汽车已经实现了东盟核心市场的全面覆盖&#xff0c;成为全球布局的重要一步。 在过去的几年里&#xff0c;长城汽车在东盟地区的市场布局…...

基于PHP的电脑商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的电脑商城系统 一 介绍 此电脑商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台对电脑商品&#xff0c;用户&#xff0c;订单&a…...

无客户端网络准入方案,为集成电路企业终端管理开启省事更省心模式

宁盾无客户端网络准入控制方案正在成为先进制造、高科技互联网企业等创新型客户的优选方案。创新型客户以技术密集型、研发人员占比高著称&#xff0c;在进行网络准入建设时&#xff0c;如何平衡好用户体验与顺利达成项目预期之间的矛盾&#xff0c;是创新企业 IT 安全团队格外…...

5G与4G的RRC协议之异同

什么是无线资源控制&#xff08;RRC&#xff09;&#xff1f; 我们知道&#xff0c;在移动通信中&#xff0c;无线资源管理是非常重要的一个环节&#xff0c;首先介绍一下什么是无线资源控制&#xff08;RRC&#xff09;。 手机和网络通过无线信道相互通信&#xff0c;彼此交…...

横扫“盲区”、“看透”缺陷,维视智造推出短波红外相机

在可见光领域&#xff0c;工业相机的视觉应用已经十分成熟&#xff0c;但在日常的客户咨询中&#xff0c;我们也经常接到一些“超纲需求”——客户想要检测“白底上的白色缺陷”、“不透明包装内的透明物体有无”等&#xff0c;均属于可见光无法实现的检测&#xff0c;而市面上…...

cgo踩坑:交叉编译过程出现的问题could not determine kind of name for C.XXX

尝试了网上的几种解决方法&#xff0c;都不行&#xff0c;现总结起来&#xff1a; 确认 /* #include <stdio.h> */ import "C"不要有空行 确认你引用的头文件存在&#xff08;stdio.h这种编译器自带的不需要你确认&#xff09; 如果引用了多个包&#xff0c…...

自然语言处理(NLP)技术的例子

以下是几个自然语言处理&#xff08;NLP&#xff09;技术的例子&#xff1a; 机器翻译&#xff1a;机器翻译是将一种自然语言的文本转换成另一种语言的文本的过程。这种技术应用于在线翻译器、多语言聊天机器人、多语言搜索引擎等地方。 文本分类&#xff1a;文本分类将文本分…...

Python“牵手”义乌购商品列表数据,关键词搜索义乌购API接口数据,义乌购API接口申请指南

义乌购平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;义乌购API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问义乌购平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现义…...

ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_IN

文章目录 ip_vs hook 后NF_INET_LOCAL_IN 本章重点&#xff1a; k8s 如何利用 ip_vs 实现源 IP 会话亲和性。 ip_vs hook 后 NF_INET_LOCAL_IN 根据优先级依次是 ip_vs_reply4&#xff0c;ip_vs_remote_request4 ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb&#xf…...

分布式之CAP理论与BASE理论

CAP理论 CAP:一致性&#xff08;consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错&#xff08;partition-tolerance&#xff09;。CAP定律说的是在一个分布式计算机系统中&#xff0c;一致性&#xff0c;可用性和分区容错性这三种保证无法同时…...

Java之初始化顺序实践

功能概述 在创建Java对象时&#xff0c;需要将对象中的成员变量进行初始化后&#xff0c;才能调用对象的构造方法创建对象。本文中将会讲解初始化时父类与子类对应的顺序。 功能实践 场景1&#xff1a;父类、子类的初始化顺序 用例代码 Test public void test_init_order(…...

静态库与动态链接库,第三方库集成到VS

目录 介绍静态库与动态链接库静态库动态链接库 如何将第三方库集成到VS上VS属性管理器配置静态库配置动态链接库属性管理器其他的内容MKL库的安装boost库的安装 介绍 众所周知&#xff0c;.c文件或者.cpp文件变成.exe文件需要经历四个过程 分别是预处理&#xff0c;编译&#…...

生态经济学领域里的R语言机器学(数据的收集与清洗、综合建模评价、数据的分析与可视化、数据的空间效应、因果推断等)

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…...

【ROS】自定义消息方面的bug总结(1)

根据需要创建功能包 一类引用ros库函数的一类是自己定义的消息类型 库函数中有的可以直接在创建功能包的时候添加依赖&#xff0c;也可以在CMakeLists.txt中手动添加 catkin_create_pkg crepes roscpp rospy std_msgs nav_msgs sensor_msgs geometry_msgs创建文件夹msg&#xf…...

CTF-XXE(持续更新,欢迎分享更多相关知识点的题目)

知识 实例 BUU [PHP]XXE 进来看到 然后一起看 Write BUU XXE COURSE 1 进来看到 一起看 write NSS [NCTF2019]Fake XML cookbook 反正是XXE 直接整 write [NCTF 2019]True XML cookbook 不整花里胡哨&#xff0c;解题在最下面 write 与博主不同&#xff0c;我通过…...

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…...

Bigemap在路桥行业是怎么应用的?

选择Bigemap的原因&#xff1a; 奥维下架了&#xff0c;后来了解到的bigemap&#xff0c;于是测试了这款软件 使用场景&#xff1a; 下载影像、矢量路网做前期策划&#xff0c;下载完数据后导出cad ,做一些标注&#xff0c;最终出图下载等高线&#xff0c;作为前期选址依据 …...

代码随想录算法训练营Day48 || ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

问题1&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...