[Linux] shell程序编写

一、shell是什么

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。

Shell的最简单定义:命令行解释器(command Interpreter)主要包含:

  • 将使用者的命令翻译给核心(kernel)处理。
  • 同时,将核心的处理结果翻译给使用者。

二、简单shell程序编写

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>#define SIZE 64
#define NUM 1024
#define SEP " "int lastcode = 0;char* homepath()
{char* home = getenv("HOME");if(home)return home;else return (char*)".";
}const char* get_user_name()
{const char* name = getenv("USER");if(name)return name;else return "none";
}const char* get_host_name()
{const char* hostname = getenv("HOSTNAME");if(hostname)return hostname;else return "none";
}const char* get_pwd()
{const char* pwd = getenv("PWD");if(pwd)return pwd;else return "none";
}int get_user_command(char* command, int num)
{printf("[%s@%s %s]# ", get_user_name(), get_host_name(), get_pwd());//获取命令行char* ret = fgets(command,num,stdin);//无论输入什么,最后一定会输入'\n'(回车)command[strlen(command) - 1] = '\0';//所以我们将该命令行数组的最后一个元素改为'\0',不会越界if(ret == NULL){return -1;}return strlen(command);}void command_split(char* in, char* out[])
{int argc = 0;//2. 分割字符串out[argc] = strtok(in, SEP);while(out[argc++]){out[argc] = strtok(NULL,SEP);}//测试// for(int i = 0; out[i]; i++)
//  {
//    printf("%d: %s\n", i, out[i]);
//  }}int excute(char* argv[])
{//4. 执行命令pid_t id = fork();{if(id < 0){return -1;}else if(id == 0){//子进程执行commandexecvp(argv[0],argv); //执行完毕后退出exit(1);}else {//父进程等待子进程int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid > 0){lastcode = WEXITSTATUS(status);}}}return 0;
}char pwd[1024];
void cd(const char* path)
{char tmp[1024];chdir(path);getcwd(tmp,sizeof tmp);sprintf(pwd, "PWD=%s",tmp);putenv(pwd);
}char myenv[10][100];//10条环境变量,一条容量为100
int v = 0;
//內键命令: 由bash自己执行,类似于自己内部的一个函数
int is_build_in(char* argv[])
{if(strcmp(argv[0], "cd") == 0){char* path = NULL;if(argv[1] == NULL)path = homepath(); else path = argv[1];cd(path);return 1;}else if(strcmp(argv[0], "export") == 0){if(argv[1] == NULL)return 1;else {strcpy(myenv[v++],argv[1]);putenv(myenv[v-1]);}}else if(strcmp(argv[0], "echo") == 0){if(argv[1] == NULL){printf("\n");return 1;}if(*(argv[1]) == '$'){char* val = argv[1]+1;if(strcmp(val,"?" ) == 0){printf("%d\n",lastcode);lastcode = 0;}else {const char* enval = getenv(val);if(enval)printf("%s\n",enval);else printf("\n");}return 1;}else {printf("%s\n",argv[1]);return 1;}}return 0;
}int main()
{while(1){lastcode = 0;char user_command_line[NUM];char* argv[SIZE] = {NULL};//1. 打印提示符&&获取用户命令字符串int n = get_user_command(user_command_line,sizeof(user_command_line));if(n <= 0)continue;//2. 分割字符串command_split(user_command_line, argv);   //3. 检查是否为內键命令n = is_build_in(argv);if(n)continue;//4. 执行命令excute(argv);     }return 0;
}

三、makefile文件

mybash:myshell.cgcc -o $@ $^ -std=c99.PHONY:clean 
clean:rm -f mybash

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

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

相关文章

数据读取及分隔方法

文章目录 读取数据1. 读取文本文件2.pandas库读取数据3.读取JSON文件 数据分隔方法1.split()2.re.split()3.splitlines() 读取数据 1. 读取文本文件 读取文本文件&#xff1a;可以使用内置的open()函数来打开文本文件&#xff0c;并使用read()或readlines()方法读取文件内容。…

Linux:网页的各种状态码及其解释

Linux&#xff1a;网页的状态码 定义&#xff1a;状态码由三位数值组成&#xff0c;第一位数值定义了响应的类别&#xff0c;且有五种可能取值 状态码含义详解1xx指示信息&#xff08;信息性状态码&#xff09;表示请求已接受&#xff0c;继续处理2xx成功表示请求已被成功接受…

overflow:scroll不生效解决

参考 问题 在给组织架构组件的外框设置overflow:scroll的时候不生效&#xff0c;没有显示滚动条 原因 这个组件里面实在是包裹太多层了&#xff0c;得找到离内容层最近的那层包裹层设置overflow才有效 解决 找到离内容层最近的那层包裹层设置overflow

OpenWrt改网桥模式(AP模式)

OpenWrt改网桥模式&#xff08;AP模式&#xff09; 点击“接口” 删掉所有 wan 接口 点击“设备”&#xff0c;配置“br-lan" 点击网桥接口&#xff0c;勾选所有接口 点击保存 添加新接口&#xff08;不添加的话路由器自身系统没网&#xff09; 返回 “网络” - “接…

k8s部署presto

&#xff08;作者&#xff1a;陈玓玏&#xff09; 一、前提条件 已部署k8s&#xff1b;已部署hadoop和hive&#xff0c;可参考以下链接&#xff1a; https://blog.csdn.net/weixin_39750084/article/details/136750613?spm1001.2014.3001.5502 https://blog.csdn.net/wei…

Linux-挂盘-分区-卸盘

Linux-挂盘-分区-卸盘 1. 添加硬盘 2. 查看硬盘 [rootlocalhost /]# lsblk # 查看我们新添加的磁盘 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 80G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 …

pdf使用pdfbox切割pdf文件MultipartFile

引入依赖&#xff1a; <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency>测试代码&#xff1a; import io.choerodon.core.iam.ResourceLevel; impo…

百度智能云参与信通院多项边缘计算标准编制,「大模型时代下云边端协同 AI 发展研讨会」成功召开

1 中国信通院联合业界制定、发布多项标准化成果&#xff0c;推动产业发展 大模型开启了 AI 原生时代&#xff0c;云边端协同 AI 构建了「集中式大规模训练」、「边缘分布式协同推理」新范式&#xff0c;有效降低推理时延和成本&#xff0c;提升数据安全和隐私性&#xff0c;也…

微服务技术框架-注册中心-能解决的问题

在微服务架构中&#xff0c;注册中心是一个关键组件&#xff0c;它解决了许多微服务通信和管理中的问题。以下是注册中心能够解决的主要问题&#xff1a; 1. 动态服务发现 问题&#xff1a;微服务实例动态增加或减少&#xff0c;手动配置服务地址非常繁琐且容易出错。 解决方案…

python的Serial 串口缓存区数据处理

没头脑很久没有处理串口数据&#xff0c;今日测试一个测距传感模块&#xff0c;用简单的serial.read没十几秒就屏幕冻住了&#xff0c;不往下print了。后来反应过来是不停访问串口&#xff0c;导致串口数据缓存区溢出了。有一个比较保险的方式如下&#xff0c;简单而言是成块读…

【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr

B站讲解视频 在大部分实际场景中&#xff0c;const 和 constexpr 是可以混用的&#xff1b;但是在创建数组用修饰的变量指定size的时候&#xff0c;只能用constexpr&#xff1b;总的来说&#xff0c;在 C 11 标准中&#xff0c;const 用于为修饰的变量添加“只读”属性&#xf…

AtCoder ABC352 A-D题解

比赛链接:ABC352 Problem A: 签到题。 #include <bits/stdc.h> using namespace std; int main(){int N,X,Y,Z;cin>>N>>X>>Y>>Z;if((X<Z && Z<Y) || (Y<Z && Z<X))cout<<"YES"<<endl;else…

数据采集与AI分析,亮数据+通义千问助力跨境电商前行

文章目录 前言工具介绍数据采集工具亮数据Web Scraper IDE亮点 AI数据分析工具 实战电商数据采集与AI分析电商平台选取数据采集完全托管数据集自定义数据集 AI分析 价格总结 前言 随着信息技术的飞速发展&#xff0c;数据采集与AI分析在跨境电商中扮演着越来越重要的角色。通过…

用ControlNet+Inpaint实现stable diffusion模特换衣

用ControlNetInpaint实现stable diffusion模特换衣 ControlNet 训练与架构详解ControlNet 的架构用于文本到图像扩散的 ControlNet训练过程Zero卷积层的作用解释 inpaintInpaint Anything 的重要性Inpaint Anything 的功能概述 在现代计算机视觉领域&#xff0c;稳定扩散&#…

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码&#xff0c;但tabbar并没有显示。代码如下&#xff1a; "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

【机器学习-08】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之决策树算法实战分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

微信H5跳小程序 wx-open-launch-weapp ios显示且正常跳转,安卓不显示不报错解决方案

前提&#xff1a;在一切都正常(无报错&#xff0c;没有写法错误等)的情况下&#xff0c;出现这个问题: 去你的h5项目&#xff0c;用浏览器打开&#xff0c;在network随便找一个静态文件&#xff0c;在response响应标头中找找&#xff0c;是否有Content-Security-Policy这个头&…

线程池相关故障梳理总结

下面贴一些典型的常见 Case&#xff0c;开发同学基本一看就懂并不神奇。 数据库相关 热更新 在事务里热更新同一条数据容易引发锁等待造成慢 SQL&#xff0c;常见于一些 update count&#xff0c;update quota 类的业务场景。 故障案例1&#xff1a;某次压测对 DB 产生瞬时 6…

服务高峰期gc,导致服务不可用

随着应用程序的复杂性和负载的不断增加&#xff0c;对JVM进行调优&#xff0c;也是保障系统稳定性的一个重要方向。 需要注意&#xff0c;调优并非首选方案&#xff0c;一般来说解决性能问题还是要从应用程序本身入手&#xff08;业务日志&#xff0c;慢请求等&#xff09;&am…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt&#xff0c;从偏移位置offset&#xff0c;对b_data开始解包&#xff0c;返回数据格式是一个元组(v1,v2…) fmt可以有&#xff1a; _struct.py: The remaining chars indicate types of args and must match exactly;…