說幾個myshell過程中的思路

2021-08-04 15:03:08 字數 1081 閱讀 3347

多管道復合

整體的思路是每個管道符隔開的命令將由shell程序建立乙個子程序去執行,那麼每個管道符隔開的命令之間將會是一系列兄弟程序,因此問題就在於怎麼把資料在兄弟程序之間傳遞,一開始打算使用高階的pipe()函式,但是過程中反覆除錯總有問題,可能是自己對程序的理解不夠深入,最後的解決方案是使用兩個臨時檔案,pipe_w負責寫入管道前的命令的執行結果 ,管道後面的命令在開始執行之前先將pipe_w重新命名成pipe_r並從中讀取輸入,這樣如果該條命令的後面還有一條管道,則可以繼續建立pipe_w並將執行結果寫入其中.

多組輸入輸出重定向組合

對於多組輸入輸出重定向的解決方案感覺有點醜陋,但這裡還是做以記錄,等到將來自己能夠實現更好的做法之後再回來嘲笑自己,哈哈.

核心的思路就是,對於每個輸入或輸出重定向都單獨的fork乙個新的程序去執行,

例如:cat > 1 > 2 > 3這個復合重定向,實際上我是將其拆分成

cat > 1

cat > 2

cat > 3

這樣分三次去遞迴執行,,,,是不是相當的醜陋……

複雜的命令解析

由於支援了複雜的管道以及輸入輸出重定向,因此對於使用者(

其實是組長哈哈哈),輸入的複雜命令就不能一句 不支援的命令 就帶過了,

而處理過程可以說是本程式的核心了,在這裡我簡單的說明一下命令最終的解析結果

/*

* 重定向記錄結構體

*/typedef structredir_t;

/* * 儲存一條不含 | 的命令的引數

* 以及i/o重定向的目標(null表示標準i/o)

*/typedef struct cmd_t;

使用上述結構體將由複雜的多管道 多輸入輸出重定向的結果儲存起來,然後在後續的程式中使用,而至於具體的解析以及使用過程,稍後會附上源**鏈結,有言在先,為了用多個函式對輸入命令進行分級解析,**中多處使用二級指標在函式之間傳遞引數,導致程式可能閱讀起來比較困難,有興趣的同學可以看看鄙人晦澀難懂的**.

github/fujie-xiyou/summer/myshell/myshell.c

專案開發過程中的幾個階段

1.evt engineering verification test 產品開發初期的設計驗證比如功能性測試等,通常這個階段的產品存在的問題還比較多。2.dvt design verification test 這通常是硬體生產中不可缺少的乙個檢測環節。3.dmt design maturity t...

Vue實踐過程中的幾個問題

路由變化頁面資料不重新整理問題 settimeout setinterval this指向改變,無法用this訪問vue例項 setinterval路由跳轉繼續執行並沒有銷毀 vue 滾動行為 瀏覽器回退記憶位置 用法 vue路由攔截瀏覽器後退實現草稿儲存類似需求 v once 只渲染元素和元件一次...

家居裝修全過程中的幾個要素

1 到那裡去找可信賴的家裝公司?假如您對應該聯絡哪家公司拿不定注重。您有集中選擇 通過朋友的介紹 去家裝市場中了解,那裡集中了許多公司 查閱報刊雜誌中的有關版面,那裡有不少相關公司的廣告 至於哪些公司才真的可信,這點必須具體考察才行。正如下面提到的,同一家公司的不同施工隊的能力都可能大不相同。所以即...