簡體   English   中英

一個演示cmd.exe和Linux shell(例如bash),定界參數的AC程序?

[英]A C program demonstrating how cmd.exe and a linux shell e.g. bash, delimit parameters?

我聽說cmd shell將整個內容傳遞給命令,然后一個標准的C庫在考慮空格和引號的情況下對其進行了界定。 而在linux中,只有Shell可以做到。

一個帶有while循環的程序,顯示argsv [i]展示了如何對其進行定界,但不是由Shell完成以及由C庫完成。

有人可以指出我或給我看一個可以顯示該程序的程序嗎?

我想您想知道Shell在Linux中是如何工作的,對嗎? 我認為,當我們在命令外殼上鍵入任何內容時,外殼會以字符串格式將所有參數作為參數接收,然后,shell對代碼執行fork + exec,然后將所有參數作為環境變量傳遞給新的二進制文件,然后將這些環境變量放入新進程的堆棧由內核提供,以后由進程作為argc和argv []進行訪問,但c庫沒有進行特殊處理。

在任何POSIX或類似POSIX的操作系統上,標准庫與將命令行解析為組件無關。 它完全由外殼完成。 POSIX exec函數家族采用一個指針數組,就像main接收一樣。 通常,由內核負責將它們整齊地排列並保存在整個exec的特定位置(通常是堆棧的頂部)(當刪除前一個程序的地址空間時)。

至於如何執行外殼的功能,一旦您閱讀了有關外殼功能的詳細說明,就很痛苦了。 您可以在這里找到:

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

您認為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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM