![](/img/trans.png)
[英]How do terminals programmatically block the backspace at a shell prompt so you can't backspace over it, e.g. $ for bash or C:\blah\>
[英]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.