【Linux】模擬實現linux的shell

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#define NUM 1024
#define SIZE 32
#define SEP " "
int main()
{//保存輸入后的字符串char cmd_line[NUM];//保存打散后的字符串char *g_argv[SIZE];//打印出提示信息while(1){printf("[root@localhost myshell]# ");//刷新緩沖區fflush(stdout);//對cmd_line進程初始化memset(cmd_line,'\0',sizeof cmd_line);//獲取用戶鍵盤輸入if(fgets(cmd_line,sizeof cmd_line,stdin) == NULL){continue;//輸入錯誤就重新執行輸入操作}//因為fgets是讀取回車的,所以我們要把字符串的最后一位給去掉cmd_line[strlen(cmd_line)-1] = '\0';//這里讀取寫出來的都是一整串字符串,例如 ls -l -a// printf("echo: %s\n", cmd_line);// 那嗎如果我們想要執行輸入的命令就要對其進行分解// 分解成:"ls"  "-a"  "-l"g_argv[0] = strtok(cmd_line,SEP);//第一次調用的時候,要傳入要分解的字符串,第二次調用的時候就可以將要分解的字符串位置寫為NULLint index = 1;if(strcmp(g_argv[0], "ls") == 0){g_argv[index++] = "--color=auto";}if(strcmp(g_argv[0], "ll") == 0){g_argv[0] = "ls";g_argv[index++] = "-l";g_argv[index++] = "--color=auto";}while(g_argv[index++] = strtok(NULL, SEP));//因為我們這個原理為子進程替換,所以當執行cd命令的時候,我們就沒有辦法來返回,或者到達一個位置//內置命令, 讓父進程(shell)自己執行的命令,我們叫做內置命令,內建命令//內建命令本質其實就是shell中的一個函數調用if(strcmp(g_argv[0],"cd") == 0){if(g_argv[1]!=NULL)chdir(g_argv[1]);continue;}//進行進程分割,子進程和父進程pid_t id = fork();if(id == 0){//子進程printf("下面功能是子進程運行的\n");execvp(g_argv[0],g_argv);exit(1);}else if(id > 0){int statu = 0;pid_t ret = waitpid(id,&statu,0);if(ret > 0) printf("exit code: %d\n", WEXITSTATUS(statu));}}return 0;
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40569.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Blazor前后端框架Known-V1.2.12

V1.2.12 Known是基于C#和Blazor開發的前后端分離快速開發框架&#xff0c;開箱即用&#xff0c;跨平臺&#xff0c;一處代碼&#xff0c;多處運行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

大文件切片上傳

創建組件&#xff1a;創建一個組件用于處理文件上傳&#xff0c;命名為Upload.vue。 <template><div><input type"file" change"handleFileChange" /><button click"startUpload">開始上傳</button></div> …

Pyinstaller 打包 django 項目如何將命令行參數加入?

起因 Pyinstaller 打包 django 項目&#xff0c;打包成 manage.exe 后用命令行 cmd manage.exe runserver 0.0.0.0:8001 --noreload 來運行感覺很不方便。 希望能夠直接把命令行參數也打包進去&#xff0c;直接運行 exe 。我走了些彎路&#xff0c;但最終實現了。 彎路 我看…

Redis之刪除策略

文章目錄 前言一、過期數據二、數據刪除策略2.1定時刪除2.2惰性刪除2.3 定期刪除2.4 刪除策略比對 三、逐出算法3.1影響數據逐出的相關配置 總結 前言 Redis的常用刪除策略 一、過期數據 Redis是一種內存級數據庫&#xff0c;所有數據均存放在內存中&#xff0c;內存中的數據可…

web基礎入門和PHP語言基礎入門 一

web基礎入門和php語言基礎入門 一 WEB簡介與HTTP入門WEB簡介HTTP 簡介HTTP 請求報文&#xff1a;請求方法&#xff1a;請求頭部&#xff1a;&#xff08;常見的請求頭&#xff09;HTTP 響應報文&#xff1a;響應狀態碼&#xff1a;Cookie HTML入門學習什么是HTML什么是標記語言…

【深入了解pytorch】PyTorch擴展:如何使用PyTorch的擴展功能

【深入了解pytorch】PyTorch擴展:如何使用PyTorch的擴展功能 PyTorch擴展:展示如何使用PyTorch的擴展功能1. 自定義損失函數2. 自定義數據加載器3. 自定義優化器總結PyTorch擴展:展示如何使用PyTorch的擴展功能 PyTorch作為一個開源的深度學習框架,在研究和應用領域廣受歡…

PHP入門基礎教程 - 專欄導讀

&#x1f3c6;作者簡介&#xff0c;黑夜開發者&#xff0c;全棧領域新星創作者?&#xff0c;CSDN博客專家&#xff0c;阿里云社區專家博主&#xff0c;2023年6月CSDN上海賽道top4。 &#x1f3c6;數年電商行業從業經驗&#xff0c;歷任核心研發工程師&#xff0c;項目技術負責…

【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-線性模擬

文章目錄 Find And Replace in String 字符串中的查找與替換問題描述&#xff1a;分析代碼線性模擬 Tag Find And Replace in String 字符串中的查找與替換 問題描述&#xff1a; 你會得到一個字符串 s (索引從 0 開始)&#xff0c;你必須對它執行 k 個替換操作。替換操作以三…

Floyd算法

正如我們所知道的&#xff0c;Floyd算法用于求最短路徑。Floyd算法可以說是Warshall算法的擴展&#xff0c;三個for循環就可以解決問題&#xff0c;所以它的時間復雜度為O(n^3)。 Floyd算法的基本思想如下&#xff1a;從任意節點A到任意節點B的最短路徑不外乎2種可能&#xff…

openGauss學習筆記-42 openGauss 高級數據管理-觸發器

文章目錄 openGauss學習筆記-42 openGauss 高級數據管理-觸發器42.1 語法格式42.2 參數說明42.3 示例 openGauss學習筆記-42 openGauss 高級數據管理-觸發器 觸發器會在指定的數據庫事件發生時自動執行函數。 42.1 語法格式 創建觸發器 CREATE TRIGGER trigger_name { BEFORE…

Swagger-ui在idea中的使用

1.添加依賴 <!--添加swagger2相關概念--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--添加swagger-ui相關功能--><de…

Linux學習之基本指令一

在學習Linux下的基本指令之前首先大家要知道Linux下一切皆目錄&#xff0c;我們的操作基本上也都是對目錄的操作&#xff0c;這里我們可以聯想我們是如何在windows上是如何操作的&#xff0c;只是形式上不同&#xff0c;類比學習更容易理解。 目錄 01.ls指令 02. pwd命令 0…

SpringBoot登錄、退出、獲取用戶信息的session處理

1、登錄方法&#xff1a;login PostMapping("/user/login")public ResponseVo<User> login(Valid RequestBody UserLoginForm userLoginForm,HttpSession session) {ResponseVo<User> userResponseVo userService.login(userLoginForm.getUsername(), …

sql A表(含有部分B表字段) 向B表插入A表數據

今天遇到一個數據庫插入問題 向表中插入 生產狀態 為 2 的數據 但生產狀態為改為12 的所有數據 查看網上的評論 參考 insert into b (a,b,c) select ‘1’,‘2’,c from a where a1 這樣就可以a,b字段是插入指定某個值,而C字段則用表a的c字段. 最后解決了。忽然想起原來也有這…

實現Python對.json文件內容的讀取和寫入

要實現Python對.json文件內容的讀取和寫入&#xff0c;可以使用json庫。 首先&#xff0c;需要安裝json庫&#xff1a; pip install json 然后&#xff0c;可以編寫以下代碼來實現對.json文件內容的讀取和寫入&#xff1a; import json# 讀取json文件 with open(data.json, …

PS實現多個圖片轉化GIF動畫

PS實現多個圖片轉化為GIF動畫步驟 一、導入圖片素材1.打開PS軟件&#xff0c;點擊 [文件] --- [腳本] ---[將文件載入堆棧]2.選擇圖片3.導入成功 二、打開時間軸1.點擊[窗口]---[時間軸]2.選擇創建幀動畫3.創建幀動畫 三、創建動畫1.復制幀。2.設置幀的內容。3.修改圖片停留的時…

分布式應用:Zabbix監控Tomcat

目錄 一、理論 1.Zabbix監控Tomcat 二、實驗 1.Zabbix監控Tomcat 三、問題 1.獲取軟件包失敗 2.tomcat 配置 JMX remote monitor不生效 3.Zabbix客戶端日志報錯 一、理論 1.Zabbix監控Tomcat &#xff08;1&#xff09;環境 zabbix服務端&#xff1a;192.168.204.214 …

推薦 4 個 yyds 的 GitHub 項目

本期推薦開源項目目錄&#xff1a; 1. 開源的 Markdown 編輯器 2. MetaGPT 3. SuperAGI 4. 一個舒適的筆記平臺 01 開源的 Markdown 編輯器 Cherry 是騰訊開源的 Markdown 編輯器&#xff0c;基于 Javascript具有輕量簡潔、易于擴展等特點&#xff0c; 它可以運行在瀏覽器或服…

UVM學習知識點

這里是引用 include 和 import pkg區別 1.作用 include與C語言中類似&#xff0c;用于在一個文件中插入另一個文件&#xff1b;import用于在一個作用域中引入一個package&#xff08;或其中的內容&#xff09;&#xff0c;使得這些內容在當前作用域中可以不添加其所在的packag…

常用游戲運營指標DAU、LTV及參考范圍

文章目錄 前言運營指標指標范圍參考值留存指標的意義總結 前言 作為游戲人免不了聽到 DAU 、UP值、留存 等名詞&#xff0c;并且有些名詞聽起來還很像&#xff0c;特別是一款上線的游戲&#xff0c;這些游戲運營指標是衡量游戲業務績效和用戶參與度的重要數據&#xff0c;想做…