2011-11-17 76 views
7

我想爲UNIX創建一個迷你shell,只是爲了瞭解所有內容。我有一些混淆理解我以前認爲理所當然的事情。這是一個哲學問題。當我創建一個「shell」時,我認爲我有一個沒有shell的UNIX,那麼在這種情況下,std和std會是什麼?沒有像system()和exec()這樣的函數使用shell來執行程序,所以如果我首先創建一個shell。這些功能如何工作?創建UNIX shell

回答

3

有在exec家庭幾個功能:execve(2)execl(3)execle(3)execlp(3)execv(3)execvp(3)。第一個,execve(2)由操作系統內核作爲系統調用提供。 (好吧,程序調用的函數是由系統C庫提供的,但它是一個圍繞系統調用的簡單包裝。)其他函數提供稍微不同的語義,並且按照execve(2)函數實現。

的殼可以使用execvp(3)execlp(3)提供PATH搜索可執行文件,但至少bash(1)哈希可執行文件的完整路徑,以提供性能優勢。 (見bash(1)內置hash瞭解詳情。)

system(3)通過/bin/sh -c實現的,因爲你已經猜到。

標準輸入和輸出由程序派生shell的程序設置。如果用戶直接在控制檯上登錄,則將由agetty(8)mgetty(8)或者其中任一個getty處理直接登錄。如果用戶通過sshd(8)登錄,則sshd(8)負責創建pty並將終端從站委託給shell。如果用戶通過xterm(1)或其他終端仿真程序創建它們的shell,那麼這些進程將負責連接shell的標準輸入,輸出和錯誤。

3

system(3)的確使用(可能直接或間接通過exec)shell來完成其工作。然而,朋友不要使用shell,而是直接執行指定的程序映像。您只需閱讀各自的man頁面即可看到此內容。

與system()不同的是,你會看到像擴展名的通配符那樣的糖,而如果你使用exec()將*作爲參數傳遞給你的程序,你的程序將會看到文字星號(可能不知道該怎麼辦)。

一個shell可以使用exec()等實現。它從稱爲TTY(電傳打字機,老派終端)或PTY(僞終端,如在現代系統中)的東西獲得stdin和stdout。請參閱posix_openpt(2)

+0

哦非常感謝 – Keeto