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

进程的那些事--实现shell

目录

前言

一、预备知识

二、实现步骤

1.思路

2.实现

总结


 前言

提示:这里可以添加本文要记录的大概内容:

        学习的本质就是变现


提示:以下是本篇文章正文内容,下面案例可供参考

一、预备知识

char * fgets ( char * str, int num, FILE * stream );      //  用于获取一整行的数据

参数:        

   char *str:指向用于存储读取到的数据的字符数组的指针。

    int num:指定 str 指向的数组的最大长度,最多会读取 num-1 个字符,以便为字符串的结尾空字符留出空间。

    FILE *stream:指向 FILE 对象的指针,该对象标识了要从中读取数据的输入流。

返回值:

        成功返回str,失败返回NULL

注意事项

        fgets 会读取字符直到遇到换行符(\n)、文件结束符(EOF)或已读取了 num-1 个字符为止。

int execvp(const char *file, char *const argv[]);        // 是一个系统调用函数,用于在当前程序中执行一个新的程序

参数:

        const char *file:要执行的文件的名称或路径,不包含路径则在环境变量PATH中查找

        char *const argv[]:以NULL结尾的字符串数组,表示要传递给执行文件的命令行参数

返回值:

        成功没有返回值,失败返回-1

注意事项:

        argv[0] 通常表示命令本身(file参数指定的文件名)

char *strtok(char *str, const char *delimiters);        //用于分割字符串

参数:

      char *str:第一次调用指向要分割字符串的指针,在后序调用中是NULL  

      const char *delimiters:确定边界

int main(int argc, char* argv[], char* env[])

{

        return 0;

}

参数:

        int argc:保存的是当前程序运行参数的个数

        char* argv[]:保存了所有运行参数--字符形式进程保存

        char* env[]:保存所有环境变量地址

一个main函数保存了三个参数,这三个参数可以不在代码中显示

二、实现步骤

1.思路

目标:实现一个shell

        实现思想:

                1:捕捉用户的输入

                2:对用户输入进行解析

                3:创建子进程

                        3.1:对子进程进行替换,替换为对应的指令

                        3.2:替换失败子进程退出

                4:父进程等待子进程退出--避免僵尸进程

2.实现

代码如下(示例):

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>int main()
{//整个进程应当是个循环while(1){//捕捉用户输入printf("[user@sxh]$ ");fflush(stdout);         //刷新标准输出文件的缓冲区char input[1024] = {0};fgets(input, 1023, stdin);//stdin表示从键盘中捕捉输入input[strlen(input) -1] = '\0';//将末尾的换行替换为结尾//对输入进行解析char *argv[32] = {NULL};//保存了所有的运行参数int argc = 0;           //保存当前程序运行参数的个数argv[argc] = strtok(input, " ");//分割第一个命令while(argv[argc] != NULL){argv[++argc] = strtok(NULL, " ");}//创建子进程,进行程序替换pid_t pid = fork();if (pid < 0){perror("fork error");}else if(pid == 0){execvp(argv[0], argv);//程序替换,其中argv[0]表示要运行的指令名称,argv指运行>的参数perror("execvp error");exit(-1);//退出程序     }wait(NULL);//等待任意子进程退出}return 0;
}


总结

相关文章:

  • 云计算中过等保三级需要的网络安全设备及详细讲解
  • 深度学习框架的选择:深入比较PyTorch与TensorFlow
  • Stable Diffusion ControlNet 的 control model(控制模型)
  • C语言 | Leetcode C语言题解之第442题数组中重复的数据
  • vue3 拖拽插件(drag)
  • UG NX二次开发(C#)-加工-创建加工坐标系,将刀位点和刀轴矢量变换到加工坐标系
  • 【python】函数介绍
  • 电子相册|智能化电子相册|基于java的电子相册管理系统设计与实现(源码+数据库+文档)
  • Python的风格应该是怎样的?除语法外,有哪些规范?
  • 深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)
  • Kafka:架构与核心机制
  • Python酷库之旅-第三方库Pandas(129)
  • UML中类和类之间关系和各种图
  • C语言 | Leetcode C语言题解之第445题两数相加II
  • 【C++】Eclipse技巧汇总
  • Angular 响应式表单 基础例子
  • bootstrap创建登录注册页面
  • Consul Config 使用Git做版本控制的实现
  • go语言学习初探(一)
  • node学习系列之简单文件上传
  • PHP面试之三:MySQL数据库
  • python3 使用 asyncio 代替线程
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • TCP拥塞控制
  • Terraform入门 - 1. 安装Terraform
  • TypeScript迭代器
  • 创建一种深思熟虑的文化
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 工作手记之html2canvas使用概述
  • 回顾2016
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 世界上最简单的无等待算法(getAndIncrement)
  • 手写一个CommonJS打包工具(一)
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 转载:[译] 内容加速黑科技趣谈
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ###C语言程序设计-----C语言学习(3)#
  • #includecmath
  • #NOIP 2014# day.1 T2 联合权值
  • (C语言)逆序输出字符串
  • (k8s中)docker netty OOM问题记录
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (分布式缓存)Redis持久化
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一) springboot详细介绍
  • (转)Sql Server 保留几位小数的两种做法
  • ..回顾17,展望18
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容