如何自己用c 實現乙個類似於windows中的cmd的程式?

時間 2021-05-11 14:56:06

1樓:風中勁草

題主意思可能是兩方面,

一是實現shell,就是windows下的批處理指令碼直譯器cmd.exe,這個是不難實現的,可以通過yacc和lex來編寫乙個語法解析器,來實現shell指令碼解釋的功能。

另乙個是終端模擬器,實現乙個支援標準輸入輸出以及能夠相容win32下終端處理函式的使用者互動介面程式

這個難度在於:破解

曾經嘗試過自己寫乙個win下的終端模擬器,替換掉conhost.exe

後來發現這個很難做到,conhost.exe被作業系統管理,在conhost.exe啟動的時候,會傳入乙個很長的uuid,應該是程序間通訊用的描述ID,這是微軟內部沒有開放的介面,只能通過破解獲取uuid的結構和作用,還有與系統相關程序的通訊協議。

然後根據這些資訊,寫出相容conhost.exe的程式。

2樓:

是shell還是那個偽終端?

類似shell的話很簡單,用readline這個很容易。

偽終端很複雜,可以參考下putty原始碼。

3樓:BILL

(誤) WinExec("C:\\Windows\\System32\\cmd.exe", SW_SHOW);

4樓:w2014

你做的console都是繼承了cmd的很多特性的啦

所以……不能完全代替cmd

至於為了滑稽起見,我支援某位答主讀取輸入傳給system函式的做法。

正經地說

做過乙個假Terminal

功能少的可憐。

按照題主要求補充上一些功能之後大概是這樣的。

基本邏輯就是gets進來乙個東西。

判斷有沒有》這一類描述重定向的符號。如果有,開啟(建立)後面的檔案作為輸出,並把後面的內容從字串移除。

判斷有沒有|這種描述管道的符號。如果有,把前後分開,當做兩個命令,分別執行。

對每乙個命令

從開頭向後,尋找第乙個不可見字元。把前面的東西拿出來(其實把這個字元換成零就好)

檢查是否是內建函式。

如果是,把後面的所有內容作為字串引數傳入函式。輸出列印到緩衝區(A)

如果不是,檢查是否是檔案。

(當時還有乙個判斷是檔案還是資料夾,然而在正常系統中是可以直接判斷的)

如果是可執行檔案,則載入執行之。後面的內容作為引數傳入。輸出重定向到某緩衝區(A)

把輸出緩衝區(A)中的內容輸出到螢幕或指定檔案,或是下乙個命令。

每次命令後清空緩衝區避免出錯。

給命令寫好usage

說著不難。上學期寫其中一部分就累死了。

主要是強迫症發作非要去考證管道和重定向的優先順序啊…clear是靠清空還是換頁啊…blabla。

(後來ddl到了啥也不想就是胡亂寫)

當然…如果你想的是完全拋棄對cmd的依賴…

自己畫視窗啊親…

還有輸入法響應啊系統訊號處理啊一大堆的…

真的會很累的啦……

畢竟是用開發視覺化程式的方法重頭做乙個命令列………………

5樓:

Windows下沒搞過,但是我在linux下搞過這種事,思路應該是類似的。首先要乙個類似詞法分析器一樣的東西(說這麼高大上其實就是乙個函式讀你輸入的命令並分析這些命令,簡單暴力的做法就是一堆if else判斷hhh),然後根據分析的結果呼叫對照的api就行了,所以感覺這件事的重點就在那些底層的api上,了解得多就會了...

(話說這種東西github上應該有哇,題主可以拿來參考參考

6樓:

和在 linux 下實現乙個簡單的 shell 差不多,大概流程:

從配置檔案中讀取配置,進行初始化。

乙個大迴圈,輸出提示符(>),不停讀取一條命令。

對讀取的命令進行簡單解析,獲取引數。對於需要後台執行(&)的命令,fork 乙個子程序,(Windows 下用 CreatProcess),用子程序去執行,父程序就繼續讀下一條命令。

接下來執行命令,如果是內部命令(exit),就去執行相應的操作。

如果是外部命令,fork 乙個子程序,子程序裡呼叫execve ,(Windows 下是 _execve 函式),把引數也傳進去。父程序等待子程序結束,並忽略 SIGCHLD 訊號來防止殭屍程序。

外部命令還要考慮在不同 path 路徑下執行。(path=)就是這樣。

7樓:JeremyGuo

我來滑稽一發

while

(true)

8樓:

YinTianliang/NT4_CMD (逃, 照著抄一遍

不過這似乎是C寫的, 當然這麼多年過去了究竟有沒有用C++重構過也不知道.

會不會被微軟請喝茶, 匿了匿了.

9樓:WHsT

你這個問題的目的不是很明確——「實現乙個類似 CMD的程式」可能有兩個意思:一是實現乙個 command line intepreter(比如 Powershell、Bash 這類東西),另乙個可能是實現乙個終端模擬器(比如 ConEmu、Gnome-Terminal、Konsole、iTerm 等)。

如果是第一種情況,就需要明確你支援的命令的語法,做乙個 intepreter。從 Lexing、Parsing 到 Interpret 等等(換句話說懂一點編譯原理)。此外你需要了解一些系統相關的程式設計支援,比如如何實現重定向、管道、改變環境變數等等。

比如在 *NIX 上你執行乙個命令,Shell 可能要先 fork 再 exec 然後 wait 等等。

如果是第二種情況,就讀讀類似於 Creating a Terminal Emulator from Scratch 的文章或者部落格,不過這應該只針對 *NIX 類系統。Windows 上的情況參見輪子哥所述。如果有精力可以看看各大開源終端模擬器的實現。

10樓:

在乙個無限迴圈中,做這麼幾件事:

1、顯示當前目錄,然後等待讀入

2、判斷讀入的是什麼命令,如果是內部命令的話,就執行對應的操作3、如果是啟動乙個程式,那就新建乙個程序,讓當前程序等待新程序結束,然後新程序負責執行這個程式。

具體函式要用哪些,自己去MSDN找Windows API

江寧是否會誕生乙個類似於新街口的商圈?

阿倫 很遺憾由於地鐵規劃的修改 一號線與三號線並沒有能在百家湖形成十字交匯,不利於客流的匯聚百家湖的金鷹 景楓 太陽城的地下空間也沒有連線起來隨著江寧人口的增加,遠期方面應該能支撐一兩個區域商業中心看好百家湖片區 獨行 很明顯很多回答的人沒有去江寧走走看看。樓主問的毫無疑問就是勝太路地鐵站周邊。樓上...

做乙個有介面的類似於貪吃蛇的遊戲,不是那種黑視窗的,應該看那些書?

推進者 easyx的圖形庫,include乙個標頭檔案就可以做介面了,而且非常簡單易學。看看庫的說明文件提供的例子基本就能用了。重點是很好上手 toyears 既然題主用的c草,樓上已經說了很多了 我說個沒人說的 SDL 2.0 去年用過一段時間,感覺還可以。三大平台有詳細的配置教程寫貪吃蛇的話,不...

畢設需要基於區塊鏈寫乙個類似於電商的電子支付系統,哪些資料應該放在鏈上

Crypochen 沒有看懂什麼是 電商的電子支付系統?理解就是做乙個電商,支付是電商的乙個重要組成部分。可以看看 openbazaar 這樣的專案,這樣的專案的目的就是開店 交易無需中心化審核,這肯定是遊走於法律之外的,交易一些非法的物品。所以感覺這樣的電商做出來是否有現實商業意義?首先,可以確定...