2010-11-11 22 views
1

我聽說cmd shell將整個事件傳遞給命令,然後標準C庫將其分隔,並考慮空格和引號。而在Linux中,只是殼做到了。一個C程序,演示cmd.exe和linux shell如何bash,分隔參數?

帶有while循環的程序顯示argsv [i]顯示它是如何被分隔的,但不是由shell執行的操作,以及C庫執行的操作。

任何人都可以指向我或顯示一個程序,它會顯示它嗎?

+0

爲什麼你認爲你所描述什麼不告訴你什麼殼做什麼程序必須做什麼? – 2010-11-11 17:29:46

+0

我說,標準庫。我的印象是,一旦達到主要方法,argsv就已經被圖書館劃定了界限。沒有? – barlop 2010-11-11 17:38:46

+0

該libc不會做任何事情。 – 2010-11-11 17:43:41

回答

2

我認爲你想知道shell是如何在linux下工作的嗎?我認爲,當我們在命令shell中鍵入任何東西時,shell將所有參數作爲字符串格式的參數接收,然後shell將fork + exec二進制文件並將所有參數作爲環境變量傳遞給新的二進制文件,然後將這些環境變量放入內核的新進程的堆棧,後來由進程作爲argc和argv []訪問,但沒有由c庫完成的特殊處理。

+0

謝謝,我感興趣的是如何對比它如何在Windows中完成..並理想的程序,表明這一點。 – barlop 2010-11-11 18:12:59

+2

嗨barlop,堆棧設置(參數設置)由內核完成,而不是在應用程序中完成,因此很難通過程序來演示,但是您可以在linux中使用strace來跟蹤完整的executeion流程,但我沒有想法如何可以在Windows中完成,我不知道在Windows中:-) – 2010-11-11 18:19:52

+0

在Windows系統上我剛剛下載並嘗試stracent(發現谷歌搜索窗口!),我嘗試了一個程序,只需要param和顯示它們。但它不是很明顯! http://pastebin.com/gtb7x2L2 – barlop 2010-11-11 18:30:37

0

您認爲Windows cmd.exe和Linux shell的工作原理是錯誤的。在兩個系統上嘗試執行echo * - Windows將顯示*,Linux將顯示當前目錄中的文件列表。

Windows程序將收到*argv[1]而沒有別的。 Linux程序將在argv中收到許多元素,每個元素都是包含空格的完整文件名稱(如果有)。

int main(int argc, char **argv) 
{ 
    int i; 
    for (i = 0; i < argc; ++i) 
    { 
     printf("%d: %s\n", i, argv[i]); 
    } 
    return 0; 
} 
+1

我在哪裏假設linux shell和cmd.exe的工作原理是一樣的?我知道*但這與用空格和引號定義哪個參數是分隔命令的參數無關。無論如何,我正在詢問一個程序,演示如何以不同的方式分隔參數。所以不,我不認爲他們的工作是一樣的。我知道*,這與我的問題無關。如果我的問題是基於任何假設,那就是他們的工作不一樣。 – barlop 2010-11-11 17:40:35

+1

@barlop,對不起,如果我誤解了這個問題,我認爲這是誤導我的標題。至於多少是由shell完成的,C程序庫完成了多少操作,通過程序很難演示,因爲所有這些都是在程序啓動之前發生的。 – 2010-11-11 18:06:39

1

在任何類似POSIX或POSIX的操作系統上,標準庫與將命令行解析爲組件無關。它完全由shell完成。 POSIX exec系列函數需要一個指針數組,就像main接收。通常,在整個exec(當前一個程序的地址空間被刪除)時,內核的責任是將它們整理並保存在一個特殊的位置(堆棧頂部是典型的)。

至於如何執行shell的操作,只要您閱讀shell的詳細說明,就很簡單,儘管很痛苦。你可以發現,這裏:

http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html