Программа на C, демонстрирующая, как cmd.exe и оболочка linux, например bash, параметры разделителя? - PullRequest
1 голос
/ 11 ноября 2010

Я слышал, что командная оболочка cmd передает все это команде, а затем стандартная библиотека C разграничивает ее, учитывая пробелы и кавычки. И это в Linux только оболочка делает это.

Программа с циклом while, отображающая argsv [i], показывает, как она разделена, но не то, что делается оболочкой, и что делает библиотека C.

Кто-нибудь может указать мне или показать программу, которая показала бы это?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Я думаю, что вы хотите знать, как работает оболочка в Linux, верно? Я думаю, что когда мы набираем что-либо в командной оболочке, оболочка получает все аргументы в виде параметров в строковом формате, затем shell + выполняет исполняемый двоичный файл и передает все аргументы в качестве переменной среды в новый двоичный файл, эти переменные среды затем помещаются стек нового процесса ядром и доступ к нему позже как argc и argv [] процессом, но никакая специальная обработка не выполняется библиотекой c.

1 голос
/ 11 ноября 2010

В любой POSIX или POSIX-подобной операционной системе стандартная библиотека не имеет ничего общего с анализом командной строки на компоненты. Это делается исключительно оболочкой. Семейство функций POSIX exec принимает массив указателей, как получает main. Обычно ядро ​​несет ответственность за аккуратное расположение и сохранение их в специальном месте (как правило, верх стека) через exec (когда адресное пространство предыдущей программы стирается).

Что касается как делать то, что делает оболочка, то это просто, хотя и болезненно, как только вы прочитаете подробное объяснение того, что делает оболочка. Вы можете найти это здесь:

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

0 голосов
/ 11 ноября 2010

Ваше предположение, что Windows cmd.exe и оболочка Linux работают одинаково, неверно.Попробуйте выполнить 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...