Аргументы командной строки
Из урока №3 мы уже знаем, что при компиляции и линкинге, компилятор создает исполняемый файл. Когда программа запускается, выполнение начинается с первой строки функции main(). До этого урока мы объявляли main() следующим образом:
int main()
1 | intmain() |
Обратите внимание, в этой версии функции main() никаких параметров нет. Тем не менее, многие программы нуждаются в некоторых входных данных
Например, предположим, что вы пишете программу под названием Picture, которая принимает изображение в качестве входных данных, а затем делает из этого изображения миниатюру (уменьшенная версия изображения). Как функция picture() узнает, какое изображение нужно принять и обработать? Пользователь должен сообщить программе, какой файл следует открыть. Это можно сделать следующим образом:
// Программа: Picture
#include <iostream>
#include <string>
int main()
{
std::cout << «Enter name of image-file to create a thumbnail for: «;
std::string filename;
std::cin >> filename;
// Открываем файл-изображение
// Создаем миниатюру
// Выводим миниатюру
}
1 |
// Программа: Picture intmain() { std::cout<<«Enter name of image-file to create a thumbnail for: «; std::stringfilename; std::cin>>filename; // Открываем файл-изображение // Создаем миниатюру // Выводим миниатюру } |
Тем не менее, здесь есть потенциальная проблема. Каждый раз при запуске программа будет ожидать пользовательский ввод. Это не проблема, если вы вручную запускаете программу из командной строки один раз для одного изображения. Но это уже проблема, если вы хотите работать с большим количеством файлов или чтобы другая программа имела возможность запустить эту программу.
Рассмотрим это детально. Например, вы хотите создать миниатюры для всех файлов-изображений, которые находятся в определенном каталоге. Как это сделать? Вы можете запускать эту программу столько раз, сколько есть изображений в каталоге, введя каждое имя файла вручную. Однако, если есть сотни изображений, такой подход будет, мягко говоря, не очень эффективным! Решением здесь будет написать программу, которая перебирала бы каждое имя файла в каталоге, вызывая каждый раз функцию picture() для каждого файла.
Теперь рассмотрим случай, когда у вас есть веб-сайт, и вы хотите, чтобы он создавал миниатюру каждый раз, когда пользователь загружает изображение на сайт. Эта программа не может принимать входные данные из Интернета и следует логический вопрос: «Как тогда вводить имя файла?». Выходом является вызов веб-сервером функции picture() автоматически каждый раз после загрузки файла.
В обоих случаях нам нужно, чтобы внешняя программа передавала имя файла в качестве входных данных в нашу программу при её запуске, вместо того, чтобы функция picture() сама дожидалась, пока пользователь вручную введет имя файла.
Аргументы командной строки — это необязательные строковые аргументы, передаваемые операционной системой в программу при её запуске. Программа может их использовать в качестве входных данных, либо игнорировать. Подобно тому, как параметры одной функции предоставляют данные для параметров другой функции, так и аргументы командной строки предоставляют возможность людям или программам предоставлять входные данные для программы.
Встроенные простые типы
Дата и время
-
dateTime
содержит дату и время в формате CCYY-MM-DThh:mm:ss
-
duration
— представляет временную длительность, которая выражена компонентами григорианских дней, часов, минут и секунд.
Например: запись P1Y2M3DT10H30M45S
означает один год (1Y), два месяца (2M), три дня (3DT), десять часов (10H), тридцать минут (30M) и 45 секунд (45S).
Запись может быть сокращенной P120M означает 120 месяцев, а Т120М — 120 минут.
-
time
содержит время в обычном формате hh:mm:ss
-
date
содержит дату в формате CCYY-MM-DD
-
gYearMonth
выделяет год и месяц в формате CCYY-MM
-
gYear
означает год в формате CCYY
-
gMonthDay
содержит месяц и день в формате MM-DD
-
gDay
день месяца в формате DD
-
gMonth
месяц в формате ММ
Строки символьные
string
— основной символьный тип.
Строка символов в виде последовательности символов Unicode , включая символы пробела, табуляции, возврата каретки и перевода строки.
-
normalizedString
— подтип типа — это строки, не содержащие символов перевода строки «\n», возврат каретки «\r» и горизонтальной табуляции «\t».-
token
— подтип типа normalizedString- нет, кроме того начальных и завершающих пробелов и несколько подряд идущих пробелов.-
language
— подтип token, определен для записи названия языка согласно рекомендации RFC 1766 , например, ru, en, de, fr. -
NMTOKEN
— подтип token, используется только в атрибутах для записи их перечисляемых значений. -
Name
— подтип token, составляют имена XML — последовательности букв, цифр, дефисов, точек, двоеточий, знаков подчеркивания, начинающиеся с буквы (кроме зарезервированной последовательности букв X, x, M, m, L, l
в любом сочетании регистров) или знака подчеркивания. Имена, начинающиеся со строки, xml
NCName
— подтип name, не содержащий двоеточие. Определены три подтипа: ID, IDREF, ENTITY, используются самой спецификацией XML.
-
language
-
token
Двоичные типы
-
boolen
— двоичное, логическое. Принимает значения: True или False (1 или 0) -
base64Binary
— двоичные целые числа в кодировке Base64 -
hexBinary
— двоичные целые числа в шестнадцатеричной форме без всяких дополнительных символов
Вещественные числа
-
decimal
составляют вещественные числа, записанные с фиксированной точкой: 123.45, -0.48747798 и т.д. -
double
и float
типы соответствуют стандарту IEEE754-85, записываются с фиксированной или плавающей точкой.
Целые числа
-
integer
— основной целый тип, содержащий числа с нулевым порядком, понимается как подтип decimal
-
number
— определяет число (без ограничений на количество цифр); может содержать знак, дроби, а также показатель степени. Значения изменяются
от 1.7976931348623157Е+308 до 2.2250738585072014Е-308
Есть ли escape-символ для двойной кавычки в xml? Я хочу написать тег вроде:
но если я поставлю «, то это означает, что строка закончилась. Мне нужно что-то вроде этого (c ++):
Printf(«Quote = \» «);
Есть ли символ, который нужно написать перед двойной цитатой, чтобы избежать его?
Новый, улучшенный ответ на старый, часто задаваемый вопрос…
Использование аргументов командной строки
Теперь, когда вы знаете, как передавать аргументы командной строки в программу, следующим шагом будет доступ к ним из программы. Для этого используется уже другая форма функции main(), которая принимает два аргумента ( и ) следующим образом:
int main(int argc, char *argv[])
1 | intmain(intargc,char*argv) |
Также вы можете увидеть и такой вариант:
int main(int argc, char** argv)
1 | intmain(intargc,char**argv) |
Хоть оба эти варианта идентичны по своей сути, но рекомендуется использовать первый, так как он интуитивно понятнее.
(англ. «argument count» = «количество аргументов») — это целочисленный параметр, содержащий количество аргументов, переданных в программу. всегда будет как минимум один, так как первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, который предоставляет пользователь, заставит увеличиться на единицу.
(англ. «argument values» = «значения аргументов») — это место, где хранятся фактические значения аргументов. Хотя объявление выглядит немного пугающе, но это всего лишь массив строк C-style. Длиной этого массива является .
Давайте напишем короткую программу , которая будет выводить значения всех аргументов командной строки:
// Программа MyArguments
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << «There are » << argc << » arguments:\n»;
// Перебираем каждый аргумент и выводим его порядковый номер и значение
for (int count=0; count < argc; ++count)
std::cout << count << » » << argv << ‘\n’;
return 0;
}
1 |
// Программа MyArguments intmain(intargc,char*argv) { std::cout<<«There are «<<argc<<» arguments:\n»; // Перебираем каждый аргумент и выводим его порядковый номер и значение for(intcount=;count<argc;++count) std::cout<<count<<» «<<argvcount<<‘\n’; return; } |
Теперь, при вызове с аргументами командной строки и , вывод будет следующим:
Нулевой параметр — это путь и имя текущей программы. Первый и второй параметры здесь являются аргументами командной строки, которые мы передали.
Синтаксис
Параметры
Параметр | Описание |
---|---|
Указывает имя удаленного сервера, на котором расположена служба. Имя должно использовать формат UNC (например, \мисервер). Чтобы запустить SC.exe локально, не используйте этот параметр. | |
Указывает имя службы, возвращенное операцией жеткэйнаме . | |
Указывает тип службы. Эти способы могут быть следующими:
|
|
Указывает тип запуска для службы. Эти способы могут быть следующими:
|
|
Указывает серьезность ошибки, если служба не запускается при запуске компьютера. Эти способы могут быть следующими:
|
|
Указывает путь к двоичному файлу службы. Значение по умолчанию для BinPath =, и эта строка должна быть указана. | |
Указывает имя группы, членом которой является эта служба. Список групп хранится в реестре в подразделе хклм\систем\куррентконтролсет\контрол\сервицеграупордер . По умолчанию используется значение NULL. | |
Указывает, следует ли получить TagID из вызова CreateService. Теги используются только для драйверов загрузки и запуска системы. | |
Указывает имена служб или групп, которые должны быть запущены перед этой службой. Имена разделяются косой чертой (/). | |
указывает имя учетной записи, в которой будет выполняться служба, или задает имя объекта драйвера Windows, в котором будет выполняться драйвер. Значение по умолчанию — LocalSystem. | |
Указывает описательное имя для идентификации службы в программах пользовательского интерфейса. Например, имя подраздела одной конкретной службы — wuauserv, которое имеет более понятное отображаемое имя автоматическое обновление. | |
Указывает пароль. Это необходимо, если используется учетная запись, отличная от учетной записи LocalSystem. | |
/? | Отображение справки в командной строке. |
Remarks
-
Каждый параметр командной строки (параметр) должен включать знак равенства как часть имени параметра.
-
Между параметром и его значением требуется пробел (например, Type =an). Если пространство не указано, операция завершается ошибкой.
Дополнительные параметры запуска 1С
- /LogUI — запись действий пользователя в лог. (Запись будет производиться в каталог пользователя, в файл под именем «logui.txt»)
- /DumpIB «Адрес файла выгрузки — выгрузка базы данных. Подходит для создания автоматического архивирования базы данных.
- /Execute «Адрес внешней обработки» — параметр предназначен для автоматического запуска внешней обработки после запуска системы.
- /C «Строка параметр» — передает параметр в конфигурацию. Обратиться к ней можно через глобальный контекст в конфигураторе «ПараметрЗапуска».
- /DisableStartupMessages – параметр убирает системные сообщения при запуске 1С Предприятие.
При внесении изменений в информационную базу, можно указать версию 1С, с помощью которой будет производиться запуск (данное решение пригодиться в случае если у вас установлено несколько баз 1С в которых вы работаете).
Пример автоматического архивирования базы 1С.
Данные параметры необходимо прописать в ярлык запуска 1С в поле «Объект», после этого будет произведен архив базы, которая находится по адресу» С:\Base_Buh» в папку «C:\Arhiv» под именем «Buh.dt». Параллельно будет произведена запись в лог файла » C:\Arhiv\log_arhiv.txt». Данные пути указаны для информационных целей, вам потребует указать свои пути, а именно местонахождение вашей базы и путь куда будут сохраняться архивы базы.
Опции
если число процессов (tasks) не задано, то по умолчанию n=1.
при отсутствии заказа времени для решения задачи выделяется по умолчанию 30 минут. Максимальное время для счета задачи:
20 часов — в будние дни (с 9 часов понедельника до 16 часов пятницы);
85 часов — на выходные (с 16 часов пятницы до 9 часов понедельника плюс 20 часов), т.е. на 85 часов задача запустится, если она войдет в решение в 16 часов ближайшей пятницы, иначе будет ждать следующей; аналогично, на 84 часа есть шанс запустить до 17 часов пятницы и т.д
до 9 часов понедельника;
100 часов — если к выходным добавляются праздничные дни.
Время может быть задано в виде:
минуты
минуты:секунды
часы:минуты:секунды
дни-часы
дни-часы:минуты
дни-часы:минуты:секунды
задает число узлов (nodes) для задачи, если пользователю это важно.
Для увеличения оперативной памяти можно воспользоваться опциями:
задаёт минимальную память в расчёте на одно ядро в мегабайтах ; если не задано, то по умолчанию 1 ГБ;
задаёт память на узле в мегабайтах.
Эти опции взаимно исключают друг друга.
задаёт запуск программы на узлах с GPU. Если не задан, то количество GPU=0, т.е
GPU при счете не используются. Если не указан тип GPU, то автоматически назначается младшая модель (m2090). Типы GPU в 2020 году m2090, k40m, v100
или позволяет указать раздел (partition) кластера для запуска задачи.
Основные разделы: tesla, apollo, v100 и debug. Эти разделы покрывают весь кластер и взаимно не пересекаются, т.е. содержат разные узлы (см. Кластер «Уран»). Список всех разделов выдается командой .
Если раздел не задан пользователем явно, то по умолчанию будет выбран раздел apollo, но при отсутствии в нем нужного числа свободных процессоров будет задействован раздел tesla. позволяет запускать задачи в специально выделенном для отладки программ разделе debug с максимальным временем счета 30 минут. Например,
Опции , , позволяют более гибко регулировать список узлов, допустимых для запуска задачи (см. ).
Например:
- — выделить заданию ресурсы узлов tesla5, tesla6, tesla7, tesla15, а если на них не хватит, то и другие узлы;
- — не выделять заданию ресурсы узла tesla22;
-
— выделять задаче только те узлы, которые имеют ресурс с именем (Feature), указанным после . На кластере имеются ресурсы с именами: tesla, a2017, a2019 (поколения узлов); bigmem (узлы с большим объёмом ОЗУ).
Информацию о том, какие ресурсы есть на конкретном узле, можно получить командой вида .
Описание всех опций и примеры команд можно посмотреть в руководстве man с помощью команд:
По умолчанию стандартный вывод пакетной задачи и стандартный поток ошибок направляются в файл с именем slurm-%j.out, где %j заменяется уникальным идентификатором (номером) задачи.
Перенаправление ввода-вывода можно выполнить, указав программе sbatch опции
При задании имени файла (filename pattern) можно использовать символы замены, в частности, заменяется на JobID, — на номер процесса в рамках задания. Таким образом при каждом запуске задачи сгенерирует уникальные имена для каждого процесса.
Выдаваемые результаты конкретной команды srun можно поместить вместо стандартного в указанный файл, добавив после команды символ перенаправления вывода .
Можно (чаще, при интерактивном запуске) параллельно просматривать результаты и сохранять их в файле, например:
Веб-интерфейс
Многие современные пакеты, такие как Jupiter Notebook или Tensor Board имеют встроенный веб-сервер, который обеспечивает взаимодействие с программой через веб-браузер. В этом случае возможно запустить сервер на узле, а браузер на хост-машине или на домашнем компьютере пользователя.
Запуск браузера на домашнем компьютере требует дополнительных настроек, связанных с пробросом портов, и здесь рассматриваться не будет.
Далее предполагается, что пользователь кластера использует подключение с поддержкой графической среды XWindow (клиенты X2Go, Mobaxterm и т.п.). Поскольку запускаемые скрипты требуют выполнения нескольких команд, они оформлены в виде файлов, которые могут запускаться как через srun, так и через sbatch.
В скриптах номера портов TCP выбираются на основе UID пользователя и базового смещения большего 1024. Это должно обеспечить возможность одновременного запуска скрипта на одном узле несколькими пользователями. Если порт случайно оказался занят, то можно поменять базу (в пределах 2000-20000) и попробовать запустить скрипт снова.
Запуск Jupiter Notebook
Для запуска Jupiter Notebook на узле, необходимо передать ему опцию —no-browser и IP адрес сетевой карты (иначе будет использован IP 127.0.0.1). Можно настроить авторизацию по паролю, отредактировав файл ~/.jupyter или выполнив команду , но авторизации по токену будет достаточно.
Скрипт запуска jupiter_slurm.sh
Запустив скрипт и дождавшись сообщения с URL и токеном можно запустить браузер и подключиться к своему JupiterNotebook.
Запуск Tensor Board
Запуск Tensor Board в целом аналогичен запуску Jupiter Notebook. В отличие от Jupiter Notebook у Tensor Board нет парольной защиты, так что теоретически возможно подключение к вашей Tensor Board какого-то пользователя кластера. При необходимости, эта проблема будет решаться административным путём — отключением слишком любопытных пользователей.
Скрипт запуска tensorboard_slurm.sh
Запуск:
Варианты запуска 1С с возможность автоматического выбора пользователя
- /N — параметр отвечающий за «Имя пользователя»
- /P — параметр отвечающий за «Пароль пользователя»
Как правило, необходимо что бы имя и пароль совпадали с именем и паролем, заданными в списке пользователей, который были введены в Конфигураторе 1С. Для того что бы посмотреть наличие пользователей в конфигураторе, необходимо перейти во вкладку «Администрирование» далее «Пользователи». В случае если у выбранного пользователя пароль пустой, его можно не указывать.
Данные параметры возможно указывать в настройках при редактировании базы в списке баз. Их можно указывать в поле «Дополнительные параметры запуска».
При запуске 1С, должно появиться данное окно:
Вам необходимо написать данные, как указано на рисунке, указав свои данные (имя и пароль), после чего нажмите кнопку «Готово». Если все данные введены верно, то в дальнейшем при входе в данную базу 1С, система не будет запрашивать у Вас данные для входа.
Обработка числовых аргументов
Аргументы командной строки всегда передаются в качестве строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в виде числа, вам нужно будет конвертировать его из строки в число. К сожалению, в языке C++ это делается немного сложнее, чем должно быть:
#include <iostream>
#include <string>
#include <sstream> // для std::stringstream
#include <cstdlib> // для exit()
int main(int argc, char *argv[])
{
if (argc <= 1)
{
// В некоторых операционных системах argv может быть просто пустой строкой, без имени программы
// Обрабатываем случай, когда argv может быть пустым или не пустым
if (argv)
std::cout << «Usage: » << argv << » <number>» << ‘\n’;
else
std::cout << «Usage: <program name> <number>» << ‘\n’;
exit(1);
}
std::stringstream convert(argv); // создаем переменную stringstream с именем convert, инициализируя её значением argv
int myint;
if (!(convert >> myint)) // выполняем конвертацию
myint = 0; // если конвертация терпит неудачу, то присваиваем myint значение по умолчанию
std::cout << «Got integer: » << myint << ‘\n’;
return 0;
}
1 |
#include <iostream> intmain(intargc,char*argv) { if(argc<=1) { // В некоторых операционных системах argv может быть просто пустой строкой, без имени программы // Обрабатываем случай, когда argv может быть пустым или не пустым if(argv) std::cout<<«Usage: «<<argv<<» <number>»<<‘\n’; else std::cout<<«Usage: <program name> <number>»<<‘\n’; exit(1); } std::stringstream convert(argv1);// создаем переменную stringstream с именем convert, инициализируя её значением argv intmyint; if(!(convert>>myint))// выполняем конвертацию myint=;// если конвертация терпит неудачу, то присваиваем myint значение по умолчанию std::cout<<«Got integer: «<<myint<<‘\n’; return; } |
Если мы запустим эту программу с аргументом командной строки , то результатом будет:
std::stringstream работает почти так же, как и std::cin. Здесь мы инициализируем переменную std::stringstream значением , так что мы можем использовать оператор для извлечения значения в переменную типа int.
Анализ аргументов командной строки
Когда вы пишете что-то в командной строке (или запускаете свою программу из среды IDE), то операционная система ответственна за то, чтобы ваш запрос проделал правильный путь. Это связано не только с запуском исполняемого файла, но и с анализом любых аргументов для определения того, как их следует обрабатывать и передавать в программу.
Операционные системы имеют обязательные правила обработки специальных символов (двойные кавычки, бэкслешы и т.д.).
Например:
Результат:
Строки, переданные в двойных кавычках, считаются частью одной и той же строки:
Результат:
Для того, чтобы вывести каждое слово на отдельной строке, используйте бэкслешы:
Результат:
Передача аргументов командной строки
Исполняемые программы могут запускаться в командной строке через вызов. Например, для запуска исполняемого файла , который находится в корневом каталоге диска C в Windows, вам нужно ввести:
Чтобы передать аргументы командной строки в , вам нужно будет их просто перечислить после имени исполняемого файла:
Теперь, при запуске , будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:
Это также работает и с Linux (хотя структура каталогов будет отличаться от структуры каталогов в Windows).
Если вы запускаете свою программу из среды IDE, то ваша IDE должна предоставить способ ввода аргументов командной строки.
Для пользователей Visual Studio: Щелкните правой кнопкой мыши по нужному проекту в меню :
Затем выберите . На правой панели будет строка . Вы сможете здесь ввести аргументы командной строки, и они будут автоматически переданы вашей программе при её запуске:
Пользователям Code::Blocks: Выберите :
Упрощённые команды
, замена , — запуск программы на кластере, аналог команды .
— выдача информации об узлах и очереди заданий с помощью команд и ( из команд и ). или — выдача информации об узлах и задачах только самого пользователя., — отмена выполнения задачи (ожидающей старта или уже стартовавшей), действуют как команда .
Команда (замена , аналог ) запускает в пакетном режиме успешно откомпилированную С- или Fortran-программу, например
где для mytest затребовано формирование 8 процессов (опция или ) с выделением каждому по умолчанию 1950 MB (т.е. 1950) и установкой входного файла () при ограничении времени счета 20-ю минутами ( или ). Так как не указаны опции и , то стандартными выходными файлами будут автоматически созданные , .
В ответ в строке вида выдаётся уникальный идентификатор () задачи в очереди заданий, здесь 1475. Уникальный идентификатор используется в командах отмены выполнения задания, например
Внимание!
1. В каталогах вида имя_программы.номер номера возрастают, начиная с 1
Пользователь должен сам удалять ненужные каталоги.
2. Для выдачи опций следует набрать
3. При необходимости можно указать команды в качестве значения параметра команды , например:
Примеры запуска
В результате интерактивного запуска программы выдаётся имя узла, на котором запущен соответствующий процесс, например:
При запуске в пакетном режиме команда запуска программы задаётся либо в скрипте, либо через опцию , например,
или
где скрипт mybat:
Внимание!
- Команда внутри скрипта может запрашивать ресурсы только в тех пределах, которые установлены командой .
- Скрипт запускается только на первом из выделенных узлов.
- Запуск нескольких процессов осуществляется командой . При этом все опции, указанные в командной строке или самом скрипте в строках , приписываются к каждой команде данного скрипта, если не переопределены в ней. Так, результирующий файл приведённого примера будет содержать 2 строки с именами узлов (возможно, одинаковых), на которых выполнятся 2 процесса задачи, сформированные командой srun.
- Если команды srun запускаются в фоновом режиме (символ в конце строки), то они при наличии ресурсов могут выполняться одновременно.
Настройка параметров запуск отладки приложения
В процессе разработки, возникает необходимость запуска отладчика 1С под определенным пользователем базы, для запуска отладчика в конфигураторе необходимо в разделе «Справка» запустить «Параметры»
Во вкладке «Запуск 1С:Предприятия» в пункте «Основные» в группе «Пользователь» по умолчанию стоит пользователь под которым вы зашли в режим «Конфигуратор», в данном окне вы можете ввести любого пользователя, который вам необходим для отладки, который в дальнейшем будет запускаться под данным пользователем.
Так же можно выбрать клиент, под которым в дальнейшем будет запускаться приложение.