где хранятся аргументы командной строки? - PullRequest
4 голосов
/ 22 января 2010

У меня есть сомнения при хранении аргументов командной строки.

myprog.exe -cfgfile myconfig.cfg

Аргументы командной строки передаются при создании процесса, поэтому они вышли за пределы процесса?

где ОС хранит его?

Ответы [ 4 ]

5 голосов
/ 22 января 2010

Для окон аргументы командной строки хранятся в блоке среды процесса (PEB), который выделяется в адресном пространстве пользовательского процесса при создании процесса.

Вы можете прочитать Windows Internals для более подробной информации. Вот фрагмент из главы 5 - Процессы, потоки и задания .

Я бы предположил, что это то же самое для вкусов Unix. Эти данные должны находиться в памяти процесса, чтобы к ним мог обращаться сам процесс.

2 голосов
/ 22 января 2010

Это зависит от ОС и, возможно, от языка. Хороший C-ориентированный ответ заключается в том, что ОС создает пространство процесса (включая загрузку кода, создание кучи и стека и т. Д.). Затем он помещает вектор аргумента командной строки в определенное место, а затем копирует адрес вектора аргумента в «argv» в стеке, а количество слов в «argc».

Только после выполнения этих задач ОС разрешает выполнение процесса.

0 голосов
/ 09 октября 2012

в Linux: аргументы командной строки будут храниться в стеке. не путайте переменную среды с аргументами командной строки, адресное пространство процесса имеет отдельную область памяти для переменных среды

0 голосов
/ 22 января 2010

Аргументы командной строки хранятся в памяти приложения. Я думаю, что именно там, где это отличается от ОС к ОС, она обычно идет внизу кучи. Код, который помещает его в исходный код ядра для exec на Unix-подобных ОС, не уверен, где он будет в Windows (не то, что вы все равно можете видеть исходный код). Код времени выполнения C (отсюда и происходит "crt") берет argv и argc из стека, а затем вызывает main. Если вам интересно узнать, как исполняемый файл запускается в Linux, этот документ Ульриха Дреппера (сопровождающий glibc) может иметь значение: http://people.redhat.com/drepper/dsohowto.pdf

...