freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux命令解釋器的設(shè)計本科畢業(yè)論文-文庫吧資料

2024-09-03 16:46本頁面
  

【正文】 函數(shù) intpipel 就是實現(xiàn) shell 管道程序的函數(shù)。 程序?qū)懙竭@,那么一個比較簡便的 shell 命令解釋器基本寫完了,但是它只局限于內(nèi)部命令和外部命令,為了完善它的功能,還需要增加很多東西和代碼。因為 pid 就是他父進程中子進程的 id 號。這就是前后臺命 令的差別。當(dāng)一個命令是前臺執(zhí)行的,那么其父進程則必須執(zhí)行函數(shù) waitpid,而且必須等待子進程,只有當(dāng)子進程結(jié)束后,父進程才可以執(zhí)行。這里用到了兩個系統(tǒng)凋用函數(shù)execv 和 waitpid。status,0)。 這一段程序如下: If((pid = fork()) == 0) Execv(buf,arg)。子進程的數(shù)據(jù)發(fā)生變化時,父進程的數(shù)據(jù)是不會由于子進程當(dāng)中的數(shù)據(jù)變化而改變自身的數(shù)據(jù)的。 fork 創(chuàng)建一個新的子進程的時 候,該進程會把其對應(yīng)的父進程的堆棧和數(shù)據(jù)都繼承下來,以及用戶的 ID、環(huán)境變量等,還有工作的目錄等等。 執(zhí)行命令 當(dāng)我們查找到命令文件時,就可以繼續(xù)執(zhí)行該命令內(nèi)容了。 當(dāng)輸入的命令被查找到時,就把相應(yīng)的命令和路徑放到數(shù)組 buf 中。 參 數(shù)說明 pathndme 是文件名稱。當(dāng)我們判斷的時后就用到了 access 系統(tǒng)調(diào)用函數(shù)。 } 當(dāng)我們對程序初始化的時候,我們已經(jīng)將命令以及其對應(yīng)的路徑已經(jīng)存儲到數(shù)組 envpath[i]中,所以下面的工作就比較好做了,就直接在相對應(yīng)的路徑下查找和判斷輸入命令到底有沒有存在。 k++。 strcat(buf,cmd)。 函數(shù)如下: int is_founded(char *cmd) { int k = 0。 continue。i=k。 if(is_founded(arg[0]) == 0){ printf(This mand is not founded!\n)。 if(is_pr == 0){ arg[k] = (char *)malloc(sizeof(char))。 查找外部程序 當(dāng)我們檢測到的命令不是內(nèi)部命令,也不是重定向命令和管道命令,就可以判斷是外部命令了。當(dāng)這個 for循環(huán)運行過后,數(shù)組 argv[0]中的內(nèi)容 就非常重要了,可以對數(shù)組 arg[0]的內(nèi)容來分辨輸入的到底是內(nèi)部命令還是外部命令。這個例子的作用就是將這條命令的 ls 首先存儲到 arg[0],而參數(shù) l 則存儲在 arg[1]。 上面程序的 for 循環(huán)的作用就是對 input 數(shù)組中的命令進行分析。 continue。\039。amp。39。 } }else{ if(input[i] == 39。 strcpy(arg[k++],buf)。\039。){ if(j == 0) continue。||input[i] == 39。i++){ if(input[i] == 39。 for(i = 0,j = 0,k = 0。然后分別調(diào)用 redirect(input, input_len)和 pipel(input, input_len)兩個函數(shù)來處理這兩類命令。 } } 該程序中用 for 循環(huán)將帶有字符“ ”,“ ”和“ |”符號的管道和重定向命令進行另外的完成。 } is_pr = 1。 add_history(input)。 free(input)。){ pipel(input,input_len)。){ if(input[i] == 39。||input[i] == 39。||input[i] == 39。i++){ if(input[i] == 39。 for(i = 0,j = 0,k = 0。 shell 中的命令分成 4種:重定向命令,普通命 令 (外部命令 ),管道命令和內(nèi)部命令。然后,就會進行 while 循環(huán),與普通的 shell 命令解釋器是一樣的,當(dāng)命令之行結(jié)束,或者將這個命令放在后臺執(zhí)行,用戶就可以重新輸入新的命令行, shell 可以重頭開始重復(fù)原來的工作。然后初始化 history 命令中鏈表的頭指針和尾指針,將 和 的值置為 0,同樣將 jobs 命令中的頭指針和尾指針分別指為空, head=end=NULL。 getenviron(n, buf)的主要作用是讀取line(fd,buf)讀取的命令,然后用冒號分隔開 buf 中的信息,將命令各自放在envpath[]中,等待后面查找命令時在 envpath[]中尋找命令。然后調(diào)用了另外兩個函數(shù) line (fd, buf]和 getenviron(n, buf)。 head = end = NULL。 } = 0。 exit(1)。 char buf[80]。初始化的工作在程序中主要是由函數(shù) init_environ來進行的。 程序結(jié)構(gòu) 這四種不同類型的命令的執(zhí)行是不一樣的,但是每種命令的程序 都有著相同的操作步驟:初始化的環(huán)境,顯示命令提示符,獲取并判定用戶輸入的命令,解析命令,最后就是尋找命令 這幾個步驟,如下圖所示: 初始化環(huán)境 在剛開始寫程序的時候,需要對幾個環(huán)境變量進行初始化的工作。 //下一節(jié)點指針 } NODE。 //命令名 char state[10]。首 先定義鏈表的節(jié)點: typedef struct NODE{ pid_t pid。 4 Shell 的實現(xiàn) 在這次設(shè)計中,首先是建立了循環(huán)數(shù)組和鏈表數(shù)組,都用于 history 命令,用數(shù)組來保存以前曾經(jīng)輸入的命令字符。在“ ”的情況下,程序的輸出被重定向到一個指定的文件中。 一個程序命令后可能還跟有元字符“ ”或“ ”,它們是重定向符,而在重定向符號后面還跟著一個文件名。 重定向 重定向就是當(dāng)執(zhí)行 shell 命令行時一般會打開三個標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件 (stdin),一般對應(yīng)終端的輸入鍵盤;標(biāo)準(zhǔn)輸出文件 (stdout)和標(biāo)準(zhǔn)錯誤輸出文件 (stderr),這兩個文件都對應(yīng)著終端的輸出屏幕。但是如果當(dāng)我們從管道的 fd[1]進行讀取數(shù)據(jù)時,或者向管道 fd[0]用于輸入數(shù)據(jù)的作用,那么就會發(fā)生錯誤,管道是嚴(yán)格的按照相應(yīng)的規(guī)則進行的。 管道相關(guān)函數(shù)簡介 編寫程序時,管道的兩端,用 fd[0]以及 fd[1]來表示,管道的兩端只能有固定的作用,不能混用。 在輸入命令時要用“ |”將兩個命令分開,系統(tǒng)就會自動從左邊的命令的輸出當(dāng)做右邊的命令的輸入。 jobs 命令: 對作業(yè)的狀態(tài)進行判斷并且輸出該狀態(tài)的信息,如 running, done, stopped running 的含義: runningProgs 0 stopped 的含義: runninoProgs= stoppedProgs done 的含義: runningProgs=0 管道 管道是 Linux 支持的最初 Unix IPC 形式之一,具有這一些特點:管道是半雙工的,管道當(dāng)中的內(nèi)容是從一個方向向另一個方向進行;所以當(dāng)兩方開始通信時,要把兩個管道創(chuàng)建起來;然而它僅僅可以用于父進程和子進程或者兩個兄弟進程之間(具有親緣關(guān)系的進程);獨自組成一個相互沒有關(guān)聯(lián)的文件系統(tǒng):其實管道可以看做是一個文件,但是 與其它普通文件不同的是它并不屬于一種文件系統(tǒng),而是自己有自己的特點,獨自構(gòu)成一種文件系統(tǒng),而且只是在內(nèi)存中。 fg 命 令: 將后臺進程發(fā)送信號切換到前臺來,即用 tcsetpgrp 獲取終端判斷進程是否退出并阻塞父進程,調(diào)用 waitpid 等待。 無&:指一個前臺作業(yè) 前臺作業(yè),該作業(yè)是終端用戶進行交互命令和接受信號,在前臺執(zhí)行 將制定的作業(yè)號存儲到該指針的鏈表中 作業(yè)數(shù)處理 numProgs、 runningProgs(加) 有&:表示為后臺作業(yè)(可以有多個) 后臺作業(yè),該作業(yè)與終端交互命令和接受信號,但是在后臺執(zhí)行 將制定的作業(yè)號存儲到該指針的鏈表中 作業(yè)數(shù)處理 numProgs、 runningProgs(加) 后臺的運行機制與前臺的運行機制的不同就是前臺要等待子進程的完成從而才可以停止父進程的操作。 4. wait%作業(yè)號則是使該作業(yè)不再繼續(xù)運行,只有后臺作業(yè)執(zhí)行完成后才可以。 2. ctrl+z 可以將一個前臺的命令暫停并且將該命令放到后臺。 &、 bg、 fg 等信號的思想 與本系統(tǒng)的任務(wù)有關(guān)的命令 (內(nèi)部命令 ): jobs、 fg、 bg 等。標(biāo)識符可以循環(huán)使用。 這個標(biāo)識符是來標(biāo)記儲存該作業(yè)的數(shù)據(jù)結(jié)構(gòu)的作用,每個命令行字符串的內(nèi)容都包含在該數(shù)據(jù)結(jié)構(gòu)中,所以說,這個數(shù)據(jù)結(jié)構(gòu)還是很重要的。會話、進程組與進程的之間的關(guān)系如圖。符號的進程組那這個就是后臺進程組。 Shell 中的對于作業(yè)的前后臺的切換就是前臺進程組和后臺進程組的切換。圖 。 進程組、會話與終端 一個對話期,有它自己對應(yīng)的控制的終端 ( controlling terminal)。 圖 為命令執(zhí)行時它們進程狀態(tài)的不同,其中 procl 和 proc2 屬于同一個后臺進程組中的進程,二 proc proc proc5 被 Shell 放到同一個前臺進程組, 在他們當(dāng)中,每一個進程都是這個進程組的組進程, Shell 調(diào)用 wait 等待它們運行結(jié)束。 當(dāng)執(zhí)行如下兩條命令時: $proc1|proc2amp。但是有一些作業(yè)是我們必須要自己看到運行的結(jié)果,這就是前臺作業(yè)。 作業(yè)及作業(yè)前后調(diào)度實現(xiàn)方法 在系統(tǒng)中,進程的運行的狀態(tài)是可以切換的。 簡單的 shell 流程圖如圖 所示: shell 設(shè)計思想 我們要從簡單的開始入手,然后開始慢慢的了解和學(xué)習(xí)復(fù)雜的 shell,剛開始要對命令進行分析然后判斷前 后臺調(diào)度 (amp。 外部命令: 外部命令其實不像我們想的很復(fù)雜,其是一個獨立的應(yīng)用,可以單獨的是一個執(zhí)行文件,也可以都集成在一個文件中的不同函數(shù)中。 內(nèi)部命令: 內(nèi)部命令由 shell 程序?qū)崿F(xiàn)。對于外部命令執(zhí)行相應(yīng)的文件。 b) 判斷是內(nèi)部命令還是外部命令。 目前, GCC 在人們的努力下,在所有的硬件平臺上的使用都很方便,而且編譯的過程也是十分簡練,使用時可以通過自己的控制來靈活的使它在任意一個編譯階段停止,由于 Unix 的可移植性較高,幾乎所有的 Unix 系統(tǒng)上都能看到 GCC編譯器,所以隨著時間的流逝, 人們會更加利用這個編譯器,會更加的完善編譯器。但是 Gcc 已經(jīng)不只是一個但單純的編譯器了,人們已經(jīng)將它的功能擴展到很多的語言上。最初, GCC 被認(rèn)為是 GNU C Complier 的縮寫。這就是自由軟件的優(yōu)點,也是大家都推崇的原因。所以,它在技術(shù)層面上是所有人的結(jié)晶,是讓很多開發(fā)者的各種想法融于一身的軟件。 2 開發(fā)環(huán)境和開發(fā)工具介紹 Ubuntu Ubuntu 比較受歡迎的原因就是,它是完全像社會人們開放的,并且希望人們對系統(tǒng)進行完善并且是一些編程愛好者們共同開發(fā)的系統(tǒng),所以 Ubuntu 目前是并將永遠(yuǎn)是免費的。 KornBash shell和 C/TC shell 還提供了其他的專門的功能:歷 史添加、別名、設(shè)置內(nèi)置變量可以阻止用戶對文件進行損壞或不小心退出,告訴用戶作業(yè)已經(jīng)結(jié)束。 Shell 的另外的重要的作用就是對用戶環(huán)境進行設(shè)定,這往往是剛開始就是初始化的時候就已經(jīng)進行了。 shell 的職責(zé) Shell 的主要功能就是根據(jù)用戶的輸入的命令行,來判斷這是哪種命令,并且通過關(guān)鍵字來分解,比如空格,如果判斷出來有不能識別的字符, shell 會自動替換該字符。 它的設(shè)計符合了 IEE POSIX 。 隨著 Linux的發(fā)展, Bourne Again shell (bash)開始流行起來。 Korn shell 的優(yōu)點就是可以不止可以再 UNIX下使用,還可以在其它的系統(tǒng)下使用。T的 David Korn 推出了 Korn shell。由于不同版本的 Shell 發(fā)布,人們開始有選擇的使用 Shell,對于不同的 Shell 有自己的見解。而且,對于大型機的使用,有擴展了其他的功能,起到了很大的幫助,但是在小型機的使用還是效率很低。它的主要的開發(fā)人是 Bill Joy。在當(dāng)時主要是對系統(tǒng)進程的管理比較方便,所以收到了很大用戶的支持,但是在交互方面還是有所不足,有待完善。 shell 的歷史 Shell 首個標(biāo)準(zhǔn)是在 1979 年由 Stephen Bourne 提出的,并且以該 人的名字來作為名字。即查看當(dāng)前發(fā)行版本可以使用的 shell Linux 的環(huán)境中可以使用的 Shell 都在 /etc/shells 文件中。 Linux 上默認(rèn)的 shell 是 GUN bash( Bourne Again shell),這是一種增強的 Bou
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1