进程的那些事--实现shell

news2024/11/18 3:25:45

目录

前言

一、预备知识

二、实现步骤

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;
}


总结

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

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

相关文章

Qt开发技巧(十)新版随机数,模拟鼠标移动,QTextEdit卡死问题,函数返回值,参数结构化,选项卡控件,窗体属性

继续讲一些Qt开发中的技巧操作&#xff1a; 1.新版随机数 Qt中有自己的随机数取值方法&#xff0c;Qt5.10以前使用qsrand方法&#xff0c; Qt5.10以后提供了新的类 QRandomGenerator QRandomGenerator64 管理随机数&#xff0c;使用更方便&#xff0c;尤其是取某个区间的随机数…

【尚跑】2024铜川红色照金半程马拉松赛,大爬坡152安全完赛

1、赛事背景 2024年9月22日8点&#xff0c;2024铜川红色照金半程马拉松赛于照金1933广场鸣枪起跑&#xff01; 起跑仪式上&#xff0c;6000位选手们合唱《歌唱祖国》&#xff0c;熟悉的旋律响彻陕甘边革命根据地照金纪念馆前&#xff0c;激昂的歌声凝聚心中不变的热爱。随着国…

短视频矩阵系统源码图--示例

短视频矩阵系统源码通常指的是用于构建和管理短视频平台的一整套软件代码。这些代码包括了前端用户界面、后端服务器逻辑、数据库设计以及可能的移动应用客户端等部分。源码是软件的原始代码&#xff0c;开发者可以通过阅读和修改源码来定制或增强系统的功能。 开发短视频矩阵系…

第一弹:llama.cpp编译

1.编译llama.cpp命令行&#xff08;电脑版本&#xff09;&#xff1b; 2.交叉编译安卓命令行版本。 一、Llama.cpp是什么&#xff1f; 二、Llama.cpp编译 首先我们尝试编译llama.cpp. 2.1 下载llama.cpp 项目的github地址&#xff1a; https://github.com/ggerganov/llama…

PMP--二模--解题--151-160

文章目录 14.敏捷–流程&#xff1a;151、 [单选] 在每日站会上&#xff0c;项目负责人注意到一位资深开发人员正在将一些简单的待办事项重新分配给其他团队成员&#xff0c;理由是让资深开发人员处理复杂事项更有效率。项目负责人应该怎么做&#xff1f; 14.敏捷--通才型专家-…

0基础跟德姆(dom)一起学AI 机器学习01-机器学习概述

【知道】人工智能 - Artificial Intelligence 人工智能 - AI is the field that studies the synthesis and analysis of computational agents that act intelligently - AI is to use computers to analog and instead of human brain - 释义 - 仿智&#xff1b; 像人…

【多线程】多线程(4)(线程安全问题的原因,如何解决线程安全问题)

【线程安全问题的原因&#xff08;重点掌握&#xff09;】 1.线程在操作系统中:随机调度&#xff0c;抢占式执行&#xff08;核心原因&#xff09; 2.多个线程同时修改一个变量 3.修改操作「不是原子的」 4.内存可见性 5.指令重排列 &#xff08;后两个原因后面再谈&…

多元函数微分学基础题

这是基础题&#xff01;&#xff01;原则上必须要在第一轮初学并做完课后习题之后再做这个基础题&#xff0c;不能有错误&#xff08;马虎大意除外&#xff09;或无法解答。如有错误&#xff0c;该单元需要重学&#xff01;&#xff01; 多元函数微分学填空题 一、填空题 如…

基于SPI协议的Flash驱动控制

1、理论知识 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是Motorola公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据传输&#…

关于Fake Location定位,运动世界校园问题

不好意思&#xff0c;之前那个文章其实是很早之前的&#xff0c;不知道为什么审核了很久一直没有通过&#xff0c;然后前几周莫名其妙点了一下重新发布&#xff0c;竟然发布成功了&#xff0c;这个方法已经失效了&#xff0c;要可以稳定&#xff0c;我建议是买一台root的手机&a…

Element-Plus中上传文件upload取消提示按钮与文字

去除提示按钮与文字 添加样式&#xff0c;让这个div进行隐藏 .el-upload__input {display: none !important; }

单片机长短按简单实现

单片机长短按简单实现 目录 单片机长短按简单实现1 原理2 示例代码2.1 按键实现 3 测试log4 其他实现方式 1 原理 按键检测和处理的步骤如下&#xff1a; 1&#xff1a;定时扫描按键&#xff08;使用定时器定时扫描&#xff0c;也可以用软件延时或者系统心跳之类的方式&#…

【动态规划-分组背包】力扣1981. 最小化目标值与所选元素的差

给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target 。 从矩阵的 每一行 中选择一个整数&#xff0c;你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。 返回 最小的绝对差 。 a 和 b 两数字的 绝对差 是 a - b 的绝对值。 示例 1&#xff1a; 输入…

DAY17||654.最大二叉树 |617.合并二叉树 |700.二叉搜索树中的搜索 |

654.最大二叉树 题目&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树…

物联网系统中TFT_LCD屏主流驱动方案详解

01 物联网系统中为什么要使用TFT-LCD驱动芯片 在物联网系统中使用TFT-LCD&#xff08;薄膜晶体管液晶显示器&#xff09;驱动芯片的原因主要可以归纳为以下几点&#xff1a; 专业性与高效性 1、专业图形处理&#xff1a;TFT-LCD驱动芯片内置了专业的图形处理引擎&#xff0…

全功能运营级开源跨境电商平台源码 —— 多语言全球化商城解决方案

实测分享【全功能运营级开源跨境电商平台】&#xff0c;它不仅默认集成了中英文双语系统&#xff0c;更内置了强大的翻译接口&#xff0c;支持自动翻译至全球133种语言&#xff0c;为商家打开通往世界的窗口。 核心特性亮点解析&#xff1a; 多语言自动翻译&#xff1a;该平台…

WEB 编程:富文本编辑器 Quill 配合 Pico.css 样式被影响的问题之还是 iframe

这个系列已经写了 3 篇了。这篇写如何使用 iframe 解决标题里面提到的问题。 前情提要 请看上一篇博文&#xff1a; WEB 编程&#xff1a;富文本编辑器 Quill 配合 Pico.css 样式被影响的问题之Shadow DOM WEB 编程&#xff1a;富文本编辑器 Quill 配合 Pico.css 样式被影响…

常见字符函数和字符串函数(上)

1. 字符分类函数 字符分类函数是一类用于判断字符是否属于特定的字符类别&#xff08;如字母、数字、标点符号等&#xff09;的函数。在C语言中&#xff0c;这些函数通常可以在<ctype.h>头文件中找到&#xff0c;它们对于文本处理和输入验证非常有用。 这些函数通常返回…

Windows系统镜像下载

目前官网还可以下载的系统有Win10和Win11&#xff0c;Win7因为已经停止维护&#xff0c;所以只能到第三方镜像站下载&#xff0c;下面将具体展示下载方法。 Win7 下载地址&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 在操作系统中找到Windows 7&#xff0c;在右侧选择…

Python | Leetcode Python题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None or head.next is None:return headnew_head self.reverseList(head.next)head.next.next head # 把下一个节点指向自己head…