歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 嵌入式Linux裸機開發(十六)――shell實現

嵌入式Linux裸機開發(十六)――shell實現

日期:2017/3/3 11:58:14   编辑:SHELL編程

嵌入式Linux裸機開發(十六)――shell實現

一、shell簡介

Shell是用戶與操作系統之間的接口,為用戶提供了使用操作系統的接口。

1、圖形界面shell

圖形界面shell(Graphical User Interface shell 即 GUI shell)
應用最為廣泛圖形界面shell是Windows Explorer(微軟的windows系列操作系統)和Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更強大的CDE、GNOME、KDE、 XFCE。

2、命令行式shell

命令行式shell(Command Line Interface shell ,即CLI shell)
常見的命令行式shell有MS-DOS系統、Windows PowerShell、Bourne shell、Korn shell 、Bourne Again shell 、POSIX shell 、C shell(包括 csh and tcsh)。

二、Linux Shell工作原理

Linux系統提供給用戶的最重要的系統程序是Shell命令語言解釋程序,shell不屬於內核部分,在核心之外,以用戶態方式運行,基本功能是解釋並執 行用戶打入的各種命令,實現用戶與Linux核心的接口。系統初啟後,核心為每個終端用戶建立一個進程去執行Shell解釋程序。shell的執行過程如下:
1、讀取用戶由鍵盤輸入的命令行。
2、解析命令,以命令名作為文件名,並將其它參數改造為系統調用execve函數內部處理所要求的形式。
3、終端進程調用fork函數建立一個子進程。
4、終端進程本身用系統調用wait4( )來等待子進程完成(如果是後台命令,則不等待)。當子進程運行時調用execve,子進程根據文件名(即命令名)到目錄中查找有關文件,將它調入內存,執行這個程序(解釋這條命令)。
5、如果命令末尾有&號(後台命令符號),則終端進程不用系統調用wait4( )等待,立即發提示符,讓用戶輸入下一個命令,轉到第1步。如果命令末尾沒有&號,則終端進程要一直等待,當子進程(即運行命令的進程)完成處理後終止,向父進程(終端進程)報告,此時終端進程醒來,在做必要的判別等工作後,終端進程發提示符,讓用戶輸入新的命令,重復上述處理過程。



程序框架:while(1) {/* repeat forever */
  type_prompt();/* display prompt on the screen */
  read_command(command,parameters);/* read input from terminal */
  if(fork()!=0) {              /* fork off child process */
    /* Parent code */
    waitpid(-1,&status,0);        /* wait for child to exit */
  } else {
    /* Child code */
    execve(command,parameters,0);/* execute command */
  }
}

二、Shell實現

Linux shell的實現大量調用了linux系統的API、Glibc等,對於運行在smart210開發板上的shell來說,需要去掉對於linux系統的依賴,將部分功能實現通過移植和重新實現,但是整體程序框架是大體相同的。本項目主要實現了一個運行在裸機的簡單的shell,有兩個命令:led、buzzer,主要功能是通過附帶參數可以打開/關閉某個LED,打開/關閉buzzer。
工程源碼見附件,可以正常燒錄在smart210運行。 參考博文:Shell 基本工作原理 (CSDN yjz0065)
手把手教你編寫一個具有基本功能的shell(博客園 五岳)
本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1788552
Copyright © Linux教程網 All Rights Reserved