1. 程式人生 > >shell的工作原理以及模擬實現shell

shell的工作原理以及模擬實現shell

1.什麼是shell?

   Linux系統的shell作為作業系統的外殼,為使用者提供使用作業系統的介面。它是命令語言、命令解釋程式及程式設計語言的統稱。

shell充當一個橋樑:
a.將使⽤者的命令翻譯給核⼼(kernel)處理。
b. 同時,將核⼼的處理結果翻譯給使⽤者。
這裡寫圖片描述

2.shell的特性

(1)執行程式

   shell類似於一個程式啟動器,shell將程式載入記憶體並執行它們。

(2)管理輸入和輸出

   使用<、>和|符號可以將輸入輸出重定向。這樣就可以告訴shell將程序的輸入和輸出連線到一個檔案或是其他程序。

(3)可程式設計

3.shell如何執行程式

shell用fork建⽴新程序,⽤execv函式簇在新程序中運⾏⽤戶指 定的程式,最後shell⽤wait命令等待新程序結束。wait系統調 ⽤同時從核心取得退出狀態或者訊號序號以告知⼦程序是如何結束的。
這裡寫圖片描述

4.按照上述流程模擬實現自己的shell

程式碼:

[cpp] view plain copy print?
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. int main()  
  5. {  
  6.     while (1)  
  7.     {  
  8.         printf(”[
    [email protected]
     MyShell]#”
    );  
  9.         fflush(stdout);  
  10.         sleep(5);  
  11.         char cmd[128];  
  12.         ssize_t s = read(0, cmd, sizeof(cmd)-1);  
  13.         if (s>0)  
  14.         {  
  15.             cmd[s - 1] = ’\0’;  
  16.         }  
  17.         else
  18.         {  
  19.             perror(”read”);  
  20.             return 1;  
  21.         }  
  22.         char *_argv[32];  
  23.         _argv[0] = cmd;  
  24.         char *start = cmd;  
  25.         int i = 1;  
  26.         while (*start)  
  27.         {  
  28.             if (isspace(*start))  
  29.             {  
  30.                 *start = ’\0’;  
  31.                 start++;  
  32.                 _argv[i++] = start;  
  33.             }  
  34.             else
  35.             {  
  36.                 start++;  
  37.             }  
  38.         }  
  39.         _argv[i] = NULL;  
  40.         pid_t id = fork();  
  41.         if (id == 0)  
  42.         {//child
  43.             execvp(_argv[0], _argv);  
  44.             exit(2);  
  45.         }  
  46.         else
  47.         {//father
  48.             int status = 0;  
  49.             pid_t ret = waitpid(id, &status, 0);  
  50.             if (ret>0 && WIFEXITED(status))  
  51.             {  
  52.                 //   printf(“wait success…exit code:%d\n”,WEXITSTATUS(status)); 
  53.             }  
  54.             else
  55.             {  
  56.                 //  printf(“wait filed..\n”);
  57.                 return 3;  
  58.             }  
  59.         }  
  60.     }  
  61.     return 0;  
  62. }  

程式演示效果:
這裡寫圖片描述

但是明顯可以看到執行命令cd .. 並沒有產生想要的效果,那是因為Shell執行的命令可以分為內建命令(built-in)和外部命令(external),前者是構建在shell內部;後者是一個獨立的檔案(可以是二進位制檔案,也可以是一個指令碼)。而cd屬於內建命令,而ls屬於外部命令,執行比較複雜。內建命令的效能要優於外部命令,因為它沒有新建程序的開銷。

5.shell如何啟動

   shell在你成功地登入進入系統後啟動,並始終作為你與系統核心的互動手段直至你退出系統。你係統上的每位使用者都有一個預設的shell。每個使用者的預設shell在系統裡的/etc/passwd檔案裡被指定。

6.附:exec用來程式替換的原理圖

這裡寫圖片描述

相關推薦

shell工作原理以及模擬實現shell

1.什麼是shell? Linux系統的shell作為作業系統的外殼,為使用者提供使用作業系統的介面。它是命令語言、命令解釋程式及程式設計語言的統稱。 shell充當一個橋樑: a.將使⽤

乾貨!!c++new和delete工作原理 以及 針對連結串列節點過載operator new 和operator delete 實現連結串列節點使用記憶體池申請和釋放空間

第一部分: new和delete的實現原理 開始談之前我們應該瞭解另一個概念“operator new”和“operator delete”: new操作符呼叫一個函式來完畢必需的記憶體分配,你可以重寫或過載這個函式來改變它的行為。new操

Linux Shell 工作原理

Linux系統提供給使用者的最重要的系統程式是Shell命令語言解釋程式。它不屬於核心部分,而是在核心之外,以使用者態方式執行。其基本功能是解釋並執行使用者打入的各種命令,實現使用者與Linux核心的介面。系統初啟後,核心為每個終端使用者建立一個程序去執行Shell解釋程

Linux下的shell工作原理是什麼?

Linux系統提供給使用者的最重要的系統程式是Shell命令語言解釋程式。它不屬於核心部分,而是在核心之外,以使用者態方式執行。其基本功能是解釋並執行使用者打入的各種命令,實現使用者與Linux核心的介面。系統初啟後,核心為每個終端使用者建立一個程序去執行Shell解釋

【java專案實踐】詳解Ajax工作原理以及實現非同步驗證使用者名稱是否存在+原始碼下載(java版)

      一年前,從不知道Ajax是什麼,伴隨著不斷的積累,到現在經常使用,逐漸有了深入的認識。今天,如果想開發一個更加人性化,友好,無重新整理,互動性更強的網頁,那您的目標一定是Ajax。 介紹

tomcat工作原理以及詳解操作

tomcat的工作原理及安裝mkdir /cdrom#創建掛載目錄mount -o loop tomcat.iso /cdromcp -a /cdrom/* .mkdir -p /ly/wwwtar -xf jdk-7u25-linux-i586.gz tar -xf apache-tomcat-7.0.42

八大排序算法原理以及Java實現(直接插入排序)

不能 oat 設立 side 堆排 八大排序 算法 line load 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 我們這裏說說八大排序就是內部排序。

Hibernate和Mybatis的工作原理以及區別

增刪改 緩存 .get poj 高效率 ron 大型網站架構 數據訪問 最簡 一、Mybatis的工作流程圖 (1)、原理詳見: MyBatis應用程序根據XML配置文件創建SqlSessionFactory,SqlSessionFactory在根據配置,配置來源於兩

純幹貨詳解iptables工作原理以及使用方法

rip -a sports 公網 寫法 內網ip 行處理 外部 是否 簡介 網絡中的防火墻,是一種將內部和外部網絡分開的方法,是一種隔離技術。防火墻在內網與外網通信時進行訪問控制,依據所設置的規則對數據包作出判斷,最大限度地阻止網絡中不法分子破壞企業網絡,從而加強了企業網絡

基於eMMC芯片技術特點工作原理以及控制器的設計方案

扇區 out 靈活性 可行性 校驗碼 ali 所有 配置 用戶 摘要: 介紹了eMMC芯片的技術特點、工作原理,以及控制器的設計方案。該設計基於Xilinx公司的Virtex6系列FPGA芯片,實現了控制器的設計方案,並給出了仿真結果,驗證了該設計方案的可行性。此外,該設計

ansible工作原理以及使用詳解

內容:1、ansible的作用以及工作結構2、ansible的安裝以及使用3、ansible的playbook使用 一、ansible的作用以及工作結構        1、ansible簡介:    

文字相似度bm25演算法的原理以及Python實現(jupyter notebook)

今天我們一起來學習一下自然語言處理中的bm25演算法,bm25演算法是常見的用來計算query和文章相關度的相似度的。其實這個演算法的原理很簡單,就是將需要計算的query分詞成w1,w2,…,wn,然後求出每一個詞和文章的相關度,最後將這些相關度進行累加,最終就可以的得到文字相似度計算

移動端車牌識別的工作原理以及特點

移動端車牌識sdk可以讓我們的手機掃一掃就能實現車牌號識別。可以運用到多個領域當中:像智慧交通、平安城市、網際網路停車、智慧停車、公安圖偵。 一、移動端車牌識別的工作原理 移動端車牌識別工作原理有以下幾步完成: 1、影象採集:通過手機攝像頭對車輛進行拍照或視訊掃描採集影象; 2、預處理:噪聲過濾、

#12、Sqoop使用過嗎?說一下sqoop的工作原理,以及使用體驗

Sqoop是什麼??? Sqoop:SQL-to-Hadoop 傳統資料庫與Hadoop間資料同步工具 利用Mapreduce分散式批處理,加快了資料傳輸速度,保證了容錯性 Sqoop的工作原理 sqoop1 import原理: 從傳統資料庫獲取元資料資訊(sc

Eureka的工作原理以及它與ZooKeeper的區別

Eureka的工作原理以及它與ZooKeeper的區別 1、Eureka 簡介: Eureka 是 Netflix 出品的用於實現服務註冊和發現的工具。 Spring Cloud 集成了 Eureka,並提供了開箱即用的支援。其中, Eureka 又可細分為 Eureka Server 和

旋轉編碼器的工作原理以及如何在Arduino中使用

在本篇文章中,我們將學習旋轉編碼器的工作原理以及如何將其與Arduino開發板一起使用。旋轉編碼器是一種位置感測器,用於確定旋轉軸的角度位置。它根據旋轉運動產生模擬或數字電訊號。 有許多不同型別的旋轉編碼器,可通過輸出訊號或感測技術進行分類。在本篇文章中,我們使用的特定旋轉編碼

關於ssm的工作原理以及相應的功能開發(一)

SSM框架的Web程式主要用到了三個技術: Spring:用到了註解和自動裝配,就是Spring的兩個精髓IOC(反向控制)和 AOP(面向切面程式設計)。 SpringMVC:用到了MVC模型,將邏輯程式碼放到Controller層處理。 Mybatis:用到了與資料庫打交道的層面,放在所有的

PCA演算法的數學原理以及Python實現

部落格中的筆記: 降維當然意味著資訊的丟失,不過鑑於實際資料本身常常存在的相關性,我們可以想辦法在降維的同時將資訊的損失儘量降低。 根據相關性來講資訊的損失量降到最低 更正式的說,向量(x,y)實際上表示線性組合: x(1,0)?+y(0,1)? 不難證明所有二

【進階3-5期】深度解析 new 原理模擬實現

本週的主題是this全面解析,本計劃一共28期,每期重點攻克一個面試重難點,如果你還不瞭解本進階計劃,文末點選檢視全部文章。 如果覺得本系列不錯,歡迎點贊、評論、轉發,您的支援就是我堅持的最大動力。 介紹下定義 new 運算子建立一個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。

Java多執行緒-----執行緒池的使用,原理以及舉例實現(三)(四):使用樣例及如何配置執行緒池大小

三.使用示例   前面我們討論了關於執行緒池的實現原理,這一節我們來看一下它的具體使用: public class Test { public static void main(String[] args) { ThreadPoolExe