【正文】
函數(shù)如下: int is_founded(char *cmd) { int k = 0。i=k。 if(is_pr == 0){ arg[k] = (char *)malloc(sizeof(char))。當(dāng)這個(gè) for循環(huán)運(yùn)行過(guò)后,數(shù)組 argv[0]中的內(nèi)容 就非常重要了,可以對(duì)數(shù)組 arg[0]的內(nèi)容來(lái)分辨輸入的到底是內(nèi)部命令還是外部命令。 上面程序的 for 循環(huán)的作用就是對(duì) input 數(shù)組中的命令進(jìn)行分析。\039。39。 strcpy(arg[k++],buf)。){ if(j == 0) continue。i++){ if(input[i] == 39。然后分別調(diào)用 redirect(input, input_len)和 pipel(input, input_len)兩個(gè)函數(shù)來(lái)處理這兩類命令。 } is_pr = 1。 free(input)。){ if(input[i] == 39。||input[i] == 39。 for(i = 0,j = 0,k = 0。然后,就會(huì)進(jìn)行 while 循環(huán),與普通的 shell 命令解釋器是一樣的,當(dāng)命令之行結(jié)束,或者將這個(gè)命令放在后臺(tái)執(zhí)行,用戶就可以重新輸入新的命令行, shell 可以重頭開(kāi)始重復(fù)原來(lái)的工作。 getenviron(n, buf)的主要作用是讀取line(fd,buf)讀取的命令,然后用冒號(hào)分隔開(kāi) buf 中的信息,將命令各自放在envpath[]中,等待后面查找命令時(shí)在 envpath[]中尋找命令。 head = end = NULL。 exit(1)。初始化的工作在程序中主要是由函數(shù) init_environ來(lái)進(jìn)行的。 //下一節(jié)點(diǎn)指針 } NODE。首 先定義鏈表的節(jié)點(diǎn): typedef struct NODE{ pid_t pid。在“ ”的情況下,程序的輸出被重定向到一個(gè)指定的文件中。 重定向 重定向就是當(dāng)執(zhí)行 shell 命令行時(shí)一般會(huì)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件 (stdin),一般對(duì)應(yīng)終端的輸入鍵盤(pán);標(biāo)準(zhǔn)輸出文件 (stdout)和標(biāo)準(zhǔn)錯(cuò)誤輸出文件 (stderr),這兩個(gè)文件都對(duì)應(yīng)著終端的輸出屏幕。 管道相關(guān)函數(shù)簡(jiǎn)介 編寫(xiě)程序時(shí),管道的兩端,用 fd[0]以及 fd[1]來(lái)表示,管道的兩端只能有固定的作用,不能混用。 jobs 命令: 對(duì)作業(yè)的狀態(tài)進(jìn)行判斷并且輸出該狀態(tài)的信息,如 running, done, stopped running 的含義: runningProgs 0 stopped 的含義: runninoProgs= stoppedProgs done 的含義: runningProgs=0 管道 管道是 Linux 支持的最初 Unix IPC 形式之一,具有這一些特點(diǎn):管道是半雙工的,管道當(dāng)中的內(nèi)容是從一個(gè)方向向另一個(gè)方向進(jìn)行;所以當(dāng)兩方開(kāi)始通信時(shí),要把兩個(gè)管道創(chuàng)建起來(lái);然而它僅僅可以用于父進(jìn)程和子進(jìn)程或者兩個(gè)兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);獨(dú)自組成一個(gè)相互沒(méi)有關(guān)聯(lián)的文件系統(tǒng):其實(shí)管道可以看做是一個(gè)文件,但是 與其它普通文件不同的是它并不屬于一種文件系統(tǒng),而是自己有自己的特點(diǎn),獨(dú)自構(gòu)成一種文件系統(tǒng),而且只是在內(nèi)存中。 無(wú)&:指一個(gè)前臺(tái)作業(yè) 前臺(tái)作業(yè),該作業(yè)是終端用戶進(jìn)行交互命令和接受信號(hào),在前臺(tái)執(zhí)行 將制定的作業(yè)號(hào)存儲(chǔ)到該指針的鏈表中 作業(yè)數(shù)處理 numProgs、 runningProgs(加) 有&:表示為后臺(tái)作業(yè)(可以有多個(gè)) 后臺(tái)作業(yè),該作業(yè)與終端交互命令和接受信號(hào),但是在后臺(tái)執(zhí)行 將制定的作業(yè)號(hào)存儲(chǔ)到該指針的鏈表中 作業(yè)數(shù)處理 numProgs、 runningProgs(加) 后臺(tái)的運(yùn)行機(jī)制與前臺(tái)的運(yùn)行機(jī)制的不同就是前臺(tái)要等待子進(jìn)程的完成從而才可以停止父進(jìn)程的操作。 2. ctrl+z 可以將一個(gè)前臺(tái)的命令暫停并且將該命令放到后臺(tái)。標(biāo)識(shí)符可以循環(huán)使用。會(huì)話、進(jìn)程組與進(jìn)程的之間的關(guān)系如圖。 Shell 中的對(duì)于作業(yè)的前后臺(tái)的切換就是前臺(tái)進(jìn)程組和后臺(tái)進(jìn)程組的切換。 進(jìn)程組、會(huì)話與終端 一個(gè)對(duì)話期,有它自己對(duì)應(yīng)的控制的終端 ( controlling terminal)。 當(dāng)執(zhí)行如下兩條命令時(shí): $proc1|proc2amp。 作業(yè)及作業(yè)前后調(diào)度實(shí)現(xiàn)方法 在系統(tǒng)中,進(jìn)程的運(yùn)行的狀態(tài)是可以切換的。 外部命令: 外部命令其實(shí)不像我們想的很復(fù)雜,其是一個(gè)獨(dú)立的應(yīng)用,可以單獨(dú)的是一個(gè)執(zhí)行文件,也可以都集成在一個(gè)文件中的不同函數(shù)中。對(duì)于外部命令執(zhí)行相應(yīng)的文件。 目前, GCC 在人們的努力下,在所有的硬件平臺(tái)上的使用都很方便,而且編譯的過(guò)程也是十分簡(jiǎn)練,使用時(shí)可以通過(guò)自己的控制來(lái)靈活的使它在任意一個(gè)編譯階段停止,由于 Unix 的可移植性較高,幾乎所有的 Unix 系統(tǒng)上都能看到 GCC編譯器,所以隨著時(shí)間的流逝, 人們會(huì)更加利用這個(gè)編譯器,會(huì)更加的完善編譯器。最初, GCC 被認(rèn)為是 GNU C Complier 的縮寫(xiě)。所以,它在技術(shù)層面上是所有人的結(jié)晶,是讓很多開(kāi)發(fā)者的各種想法融于一身的軟件。 KornBash shell和 C/TC shell 還提供了其他的專門(mén)的功能:歷 史添加、別名、設(shè)置內(nèi)置變量可以阻止用戶對(duì)文件進(jìn)行損壞或不小心退出,告訴用戶作業(yè)已經(jīng)結(jié)束。 shell 的職責(zé) Shell 的主要功能就是根據(jù)用戶的輸入的命令行,來(lái)判斷這是哪種命令,并且通過(guò)關(guān)鍵字來(lái)分解,比如空格,如果判斷出來(lái)有不能識(shí)別的字符, shell 會(huì)自動(dòng)替換該字符。 隨著 Linux的發(fā)展, Bourne Again shell (bash)開(kāi)始流行起來(lái)。T的 David Korn 推出了 Korn shell。而且,對(duì)于大型機(jī)的使用,有擴(kuò)展了其他的功能,起到了很大的幫助,但是在小型機(jī)的使用還是效率很低。在當(dāng)時(shí)主要是對(duì)系統(tǒng)進(jìn)程的管理比較方便,所以收到了很大用戶的支持,但是在交互方面還是有所不足,有待完善。即查看當(dāng)前發(fā)行版本可以使用的 shell Linux 的環(huán)境中可以使用的 Shell 都在 /etc/shells 文件中。 Korn shell 幾乎完全向上兼容 Bourne shell,所以老的 Bourne 程序在 Kore shell 中運(yùn)行良好。大部分的用戶還是更傾向于 C shell,其實(shí)管理者們還是傾向于 Bourne Shell。 Bourne shell 是標(biāo)準(zhǔn)的 UXIN shell,用于系統(tǒng)管理。 當(dāng)人們輸入一組類似的命令是,希望會(huì)這些命令會(huì)自行的完成。內(nèi)核之外的自己編寫(xiě)的程序以及 shell 程序都保存在磁盤(pán)上,內(nèi)核將這些程序加載到內(nèi)存中運(yùn)行,而且對(duì)它們運(yùn)行完后進(jìn)行系統(tǒng)清理。 1 緒論 Shell 的定義 Shell 是一種特殊的程序,如下圖所示。 BASH:是 GNU 的 Bourne Again Shell,是 GNU 操作系統(tǒng)上默認(rèn)的 shell。而 shell 就像窗口管理器一樣,它可以對(duì)系統(tǒng)靈活地進(jìn)行各種管理。 Shell 是一個(gè)命令解釋器,它就是把用戶輸入的命令進(jìn)行重新解釋而且把這些命令送到內(nèi)核中。 輸入重定向,顧名思義,就是所把命令(或可執(zhí)行程序)的標(biāo)準(zhǔn)輸入重新定向到自己所認(rèn)定的文件中。 管道是 Linux 支持的最初 Unix IPC 其中的一個(gè),具有這一些特點(diǎn):管道是半雙工的,里面的數(shù)據(jù)只能單向的流動(dòng);當(dāng)雙方需要通信時(shí),要?jiǎng)?chuàng)造出來(lái)兩個(gè)管道 ;但是只能用于父子進(jìn)程和兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);其實(shí)就是他們自己獨(dú)自組成一種的文件系統(tǒng),這個(gè)文件系統(tǒng)是獨(dú)立的:管道相對(duì)于管道兩端的進(jìn)程來(lái)說(shuō),就是獨(dú)立的文件,它不是一般的文件,它并不屬于一種文件系統(tǒng),而是自己有自己的特點(diǎn),獨(dú)自構(gòu)成一種文件系統(tǒng),而且只是在內(nèi)存中。 關(guān)鍵詞: Shell;程序;設(shè)計(jì)與實(shí)現(xiàn);嵌入式; Linux Abstract: Acpanied by the popularize of the Linux,more and more people are doing deeply study in study of shell is the most important thing when study the mainly includes the understand of some knowledge and function of the micro linux the study of the orders in the shell like list,pipe,input redirect and output redirect,readers can have a thorough sense about the shell and learn to use these orders accurately in shell which play an important role in programming accurately and achieve a simple shell with the functions above after analyzing the details of every functions module. Moreover,in the embedded field,the hardware resources are limited,but demand is means they have to use limited resources to acplish a variety of needs and embedded design and programming in the traditional PC,is very different ,and it often requires only a small part of a large program on meet its needs,so we had to cut out a number of useless programs in exchange for space .In the embedded field,as the traditional K shell,C shell,Bourne shell and other largescale shell program will make our hardware resources are we need a more suitable for embedded systems used in the shell,this is my another objective of this design. Key words:Shell,Process,Design,Design and achieve,embedded,Linux 前言 shell 作為 Linux 系統(tǒng)的最外層的部分,為使用者提供必備的接口。 并且,在嵌入式領(lǐng)域中,與人們的需求相比 ,硬件的資源是微不足道的。本文主要是研究了對(duì) shell 的功能的一些認(rèn)識(shí),而且對(duì) shell 的列表,管道,輸入重定向和輸出重定向等命令功能進(jìn)行了實(shí)現(xiàn),可以對(duì) shell 命令解釋器進(jìn)行更加全面的認(rèn)識(shí)和充分的了解,而且在 shell 命令解釋器中執(zhí)行正確的命令,從而對(duì)它的原理,方法等在程序中必須用到的知識(shí)原理有比較清楚的認(rèn)識(shí),最后通過(guò)對(duì)每個(gè)功能的詳細(xì)分析,進(jìn)而編寫(xiě)出恰當(dāng)實(shí)現(xiàn)各個(gè)功能的代碼,從而做成一個(gè) Shell 命令解釋器。因此我們需要一個(gè)更符合嵌入式系統(tǒng)中使用的 Shell。本論文就是模擬一個(gè) shell 命令解釋器,包括:管道、內(nèi)部命令、外部命令、重定向命令。進(jìn)程將從標(biāo)準(zhǔn)輸入文件中讀取輸入數(shù)據(jù),將正確的數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,將不正確的信息輸出到標(biāo)準(zhǔn)錯(cuò)誤文件中。該命令的輸出就不會(huì)在屏幕上顯示,而是寫(xiě)入到自己的目標(biāo)文件中。現(xiàn)在在 Linux 中稍微流行的窗口管理器就是是 KDE。目前主要有下列版本的Shell: Bourne Shell:由貝爾爾實(shí)驗(yàn)室研發(fā)的。 如果我們是經(jīng)常使用 UMX/Linux 系統(tǒng)的研發(fā)人員,我們對(duì) shell 的功能會(huì) 有很深的認(rèn)識(shí)和理解。它對(duì)進(jìn)程,內(nèi)存,文件和通信等都無(wú)時(shí)無(wú)刻的管理著。Shell 會(huì)根據(jù)用戶輸入的命令后來(lái)執(zhí)行命 令:根據(jù)命令行的關(guān)鍵字來(lái)判斷是那種命令,然后執(zhí)行命令。這三種 Shell 功能是很類似的,如果作為腳本的話,它們的還是有不同的。 C Shell完善了很多不同的功能,就像查詢命令行歷史,作業(yè)的前后臺(tái)控制等。 Korn shell 是 AT& T的 David Korn 開(kāi)發(fā)的,它是 Bourne shell 的 個(gè)擴(kuò)展集,在增強(qiáng)改進(jìn) C shell 的基礎(chǔ)上, Korn shell 添加了更多功能。如果用戶想了解自己裝的Linux 是用的哪些 Shell,直接在終端輸入命令行: $cat/etc/shellls。 Bourne Shell 是建立在 Algol 的程序的基礎(chǔ)上的。 C shell 就是完善了 Bourne shell 的不足,是用戶與系統(tǒng)的交互更加的方便。 20 世紀(jì) 80 年代中期, ATamp。由于 Korn shell 是對(duì) Bourne shell的拓展,由學(xué)習(xí)了 C shell 的優(yōu)點(diǎn),所以用戶數(shù)很多。 bash又增加了很多新的功