Откуда берется argc? - PullRequest
       0

Откуда берется argc?

2 голосов
/ 21 января 2012

Новый процесс создается с помощью fork / exec. Exec устанавливает аргументы командной строки, но я не вижу, чтобы он устанавливал количество этих аргументов для вставки argc.

main() должна быть первой функцией, запущенной в новом процессе, но argc к этому моменту уже установлена.

Где это установлено? Это должен быть какой-то код установки, который подсчитывает параметры перед вызовом main, но ничего из того, что я прочитал, не объясняет, что делает этот код установки или где он находится.

Это в libc? Это то же самое на каждой ОС и покрыто какой-то спецификацией? Где я могу найти то, что происходит в коде установки, кроме этого? Это называется до создания глобалов?

Ответы [ 4 ]

6 голосов
/ 21 января 2012

В большинстве реализаций есть много вещей, которые происходят до того, как вызывается main (обычно среда, настроенная на что-то похожее на crt0, запуск среды выполнения C).

Есть также много вещей, которые могутслучаются после main выходов, таких как закрытие ресурса, atexit обработчики выхода и т. д.

Стандарты C действительно охватывают только то, что происходит с точки зрения языка, а некак реализации делают свою работу под прикрытием (это в основном то, что вы спрашиваете).Каждая реализация может действовать по-разному, но многие типы UNIX будут иметь что-то вроде вышеупомянутого crt0, который выполняет настройку.

0 голосов
/ 21 января 2012

В C и C ++ main() вызывается из mainCRTStartup() или аналогичной функции, зависящей от ваших инструментов сборки. Если вы сломаете отладчик и изучите стек вызовов, вы сможете найти источник.

0 голосов
/ 21 января 2012

Использование fork приводит к продолжению на следующей строке кода. Семейство функций Exec создает новое выполнение, в зависимости от которого вы используете второй параметр функции, который может быть массивом параметров.

#include <unistd.h>


int ret;
char *cmd[] = { "ls", "-l", (char *)0 };
char *env[] = { "HOME=/usr/home", "LOGNAME=home", (char *)0 };
...
ret = execve ("/bin/ls", cmd, env);
0 голосов
/ 21 января 2012

ОС позаботится об этом. В конце концов, именно ОС обрабатывает потоки и процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...