std.process
Функции для запуска и взаимодействия с другими процессами, а также для работы со средой выполнения текущего процесса.
- Обработка процессов
-
spawnProcessзапускает новый процесс, необязательно назначив ему произвольный набор потоков стандартного ввода, вывода и ошибок. Функция возвращает немедленно, оставляя дочерний процесс для выполнения параллельно с родительским. Все остальные функции в этом модуле, запускающие процессы, построены вокругspawnProcess. -
waitзаставляет родительский процесс ожидать завершения дочернего процесса. В общем случае это всегда следует делать, чтобы избежать превращения дочерних процессов в «зомби» при завершении родительского процесса. Блокирующие конструкции идеально подходят для этого – см. документациюspawnProcessдля примеров.tryWaitпохожа наwait, но не блокирует, если процесс ещё не завершился. -
pipeProcessтакже запускает дочерний процесс, который выполняется параллельно с родительским. Однако вместо произвольных потоков он автоматически создаёт набор каналов, позволяющих родительскому процессу общаться с дочерним через стандартный ввод, вывод и/или потоки ошибок дочернего. Эта функция примерно соответствует функции Cpopen. -
executeзапускает новый процесс и ожидает его завершения перед возвратом. Кроме того, он перехватывает стандартные потоки вывода и ошибок процесса и возвращает вывод этих потоков в виде строки. -
spawnShell,pipeShellиexecuteShellработают какspawnProcess,pipeProcessиexecute, соответственно, за исключением того, что они принимают одну строку команды и запускают её через интерпретатор команд по умолчанию текущего пользователя.executeShellпримерно соответствует функции Csystem. -
killпытается завершить запущенный процесс.
| Запускает программу напрямую | Запускает командную строку | |
|---|---|---|
| Создание процесса низкого уровня | spawnProcess | spawnShell |
| Автоматическое перенаправление ввода/вывода с использованием каналов | pipeProcess | pipeShell |
| Выполнить и дождаться завершения, собрать вывод | execute | executeShell |
- Другие функциональности
-
pipeиспользуется для создания однонаправленных каналов. -
environment— это интерфейс, посредством которого можно читать и изменять переменные среды текущего процесса. -
escapeShellCommandиescapeShellFileNameполезны для построения командных строк оболочки портативным способом.
- Авторы:
- Lars Tandle Kyllingstad, Steven Schveighoffer, Vladimir Panteleev
- Лицензия:
- Boost License 1.0.
- Исходный код
- std/process.d
- Примечание
- Большая часть функциональности в этом модуле недоступна в iOS, tvOS и watchOS. Доступными функциями на этих платформах являются:
environment,thisProcessIDиthisThreadID.
- абстрактный класс environment;
-
Управляет переменными среды с помощью интерфейса, похожем на ассоциативный массив.
Этот класс содержит только статические методы и не может быть экземпляризован. Ниже приведены примеры использования.
- статический @safe string opIndex(scope const(char)[] name);
-
Извлекает значение переменной среды с заданным
name.auto path = environment["PATH"];
- Исключения:
-
Exception, если переменная среды не существует, илиstd.utf.UTFException, если переменная содержит недопустимые символы UTF-16 (только Windows).
- См. также:
-
environment.get, который не генерирует исключение при неудаче.
- статический @safe string get(scope const(char)[] name, string defaultValue = null);
-
Извлекает значение переменной среды с заданным
name, или значение по умолчанию, если переменная не существует.В отличие от
environment.opIndex, эта функция никогда не генерирует исключение в Posix.auto sh = environment.get("SHELL", "/bin/sh");Эта функция также полезна для проверки существования переменной среды.auto myVar = environment.get("MYVAR"); if (myVar is null) { // Environment variable doesn't exist. // Note that we have to use 'is' for the comparison, since // myVar == null is also true if the variable exists but is // empty. }- Параметры:
const(char)[] nameимя переменной среды для извлечения string defaultValueзначение по умолчанию, которое будет возвращено, если переменная среды не существует.
- Возвращает:
- значение переменной среды, если найдена, в противном случае
nullесли переменной не существует.
- Исключения:
-
std.utf.UTFException, если переменная содержит недопустимые символы UTF-16 (только Windows).
- статический @trusted inout(char)[] opIndexAssign(inout char[] value, scope const(char)[] name);
-
Присваивает данное
valueпеременной среды с заданнымname. Еслиvalueравно null, переменная удаляется из среды.Если переменная не существует, она будет создана. Если она уже существует, она будет перезаписана.
environment["foo"] = "bar";
- Исключения:
-
Exception, если переменная среды не может быть добавлена (например, если имя некорректно).
- Примечание
- На некоторых платформах изменение переменных среды может быть недоступно в многопоточных программах. См., например, glibc.
- статический nothrow @nogc @trusted void remove(scope const(char)[] name);
-
Удаляет переменную среды с заданным
name.Если переменная не существует в среде, функция успешно возвращается, ничего не делая.
- Примечание
- На некоторых платформах изменение переменных среды может быть недоступно в многопоточных программах. См., например, glibc.
- @trusted bool opBinaryRight(string op : "in")(scope const(char)[] name);
-
Определяет, определена ли переменная в среде.
Поскольку она не возвращает значение, эта функция быстрее, чем
get. Однако, если вам также нужно значение, вы должны просто проверить результатgetнаnullвместо того, чтобы сначала использовать эту функцию.- Пример
// good usage if ("MY_ENV_FLAG" in environment) doSomething(); // bad usage if ("MY_ENV_VAR" in environment) doSomething(environment["MY_ENV_VAR"]); // do this instead if (auto var = environment.get("MY_ENV_VAR")) doSomething(var); - статический @trusted string[string] toAA();
-
Копирует все переменные среды в ассоциативный массив.
- Специфично для Windows
- Хотя имена переменных среды Windows нечувствительны к регистру, встроенные ассоциативные массивы D нечувствительны. Эта функция будет хранить все имена переменных в верхнем регистре (например,
PATH).
- Исключения:
-
Exception, если переменные среды не могут быть извлечены (только Windows).
- nothrow @property @trusted int thisProcessID();
-
Возвращает идентификатор процесса текущего процесса, который гарантированно уникален в системе.
- Пример
writefln("Current process ID: %d", thisProcessID); - nothrow @property @trusted ThreadID thisThreadID();
-
Возвращает идентификатор процесса текущей нити, который гарантированно уникален в пределах текущего процесса.
- Возвращает:
- Значение
core.thread.ThreadIDдля вызывающей нити.
- Пример
writefln("Current thread ID: %s", thisThreadID); - @safe Pid spawnProcess(scope const(char[])[] args, File stdin = std.stdio.stdin, File stdout = std.stdio.stdout, File stderr = std.stdio.stderr, const string[string] env = null, Config config = Config.none, scope const char[] workDir = null);
@trusted Pid spawnProcess(scope const(char[])[] args, const string[string] env, Config config = Config.none, scope const(char)[] workDir = null);
@trusted Pid spawnProcess(scope const(char)[] program, File stdin = std.stdio.stdin, File stdout = std.stdio.stdout, File stderr = std.stdio.stderr, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null);
@trusted Pid spawnProcess(scope const(char)[] program, const string[string] env, Config config = Config.none, scope const(char)[] workDir = null);
-
Создаёт новый процесс, необязательно присваивая ему произвольный набор стандартных потоков ввода, вывода и ошибок.
Функция возвращает немедленно, оставляя дочерний процесс для выполнения параллельно с родительским. Рекомендуется всегда вызывать
waitпо возвращаемомуPid, если процесс не был запущен с флагомConfig.detached, как подробно описано в документации дляwait.- Командная строка
- Существует четыре перегрузки этой функции. Первые две принимают массив строк,
args, который должен содержать имя программы в качестве нулевого элемента и любые аргументы командной строки в последующих элементах. Третья и четвёртая версии включены для удобства и могут использоваться, когда нет аргументов командной строки. Они принимают одну строку,program, которая определяет имя программы.
args[0]илиprogram,spawnProcessбудет искать программу в зависимости от платформы. В системах POSIX он будет искать исполняемый файл в каталогах, перечисленных в переменной среды PATH, в порядке их перечисления. В Windows он будет искать исполняемый файл в следующей последовательности:- Каталог, из которого загружено приложение.
- Текущий каталог для родительского процесса.
- 32-битный системный каталог Windows.
- 16-битный системный каталог Windows.
- Каталог Windows.
- Каталоги, перечисленные в переменной среды PATH.
// Run an executable called "prog" located in the current working // directory: auto pid = spawnProcess("./prog"); scope(exit) wait(pid); // We can do something else while the program runs. The scope guard // ensures that the process is waited for at the end of the scope. ... // Run DMD on the file "myprog.d", specifying a few compiler switches: auto dmdPid = spawnProcess(["dmd", "-O", "-release", "-inline", "myprog.d" ]); if (wait(dmdPid) != 0) writeln("Compilation failed!");- Переменные среды
- По умолчанию дочерний процесс наследует среду родительского процесса, а также любые дополнительные переменные, указанные в параметре
env. Если одна и та же переменная существует как в среде родителя, так и вenv, то последняя имеет приоритет.
Config.newEnvустановлен вconfig, дочерний процесс не будет наследовать среду родителя. Вся его среда будет определяться значениемenv.wait(spawnProcess("myapp", ["foo" : "bar"], Config.newEnv));- Стандартные потоки
- Необязательные аргументы
stdin,stdoutиstderrмогут использоваться для присвоения произвольных объектовstd.stdio.Fileкак стандартных потоков ввода, вывода и ошибок дочернего процесса соответственно. Первый должен быть открыт для чтения, а два других — для записи. По умолчанию дочерний процесс наследует стандартные потоки родителя.
// Run DMD on the file myprog.d, logging any error messages to a // file named errors.log. auto logFile = File("errors.log", "w"); auto pid = spawnProcess(["dmd", "myprog.d"], std.stdio.stdin, std.stdio.stdout, logFile); if (wait(pid) != 0) writeln("Compilation failed. See errors.log for details.");Обратите внимание, что если вы передаёте объектFile, который не является одним из стандартных потоков ввода/вывода/ошибок родительского процесса, этот поток по умолчанию будет закрыт в родительском процессе при возврате этой функции. См. документациюConfigниже для получения информации о том, как отключить это поведение. Будьте осторожны с проблемами буферизации при передаче объектовFileфункциямspawnProcess. Дочерний процесс унаследует низкоуровневый сырой смещение чтения/записи, связанное с базовым дескриптором файла, но не будет знать о каких-либо буферизованных данных. В тех случаях, когда это имеет значение (например, когда файл должен быть выровнен перед передачей дочернему процессу), может быть хорошей идеей использовать небуферизованные потоки или, по крайней мере, гарантировать, что все соответствующие буферы будут сброшены.- Параметры:
const(char[])[] argsМассив, содержащий имя программы в качестве нулевого элемента и любые аргументы командной строки в последующих элементах. File stdinПоток стандартного ввода дочернего процесса. Это может быть любой std.stdio.File, открытый для чтения. По умолчанию дочерний процесс наследует поток ввода родителя.File stdoutПоток стандартного вывода дочернего процесса. Это может быть любой std.stdio.File, открытый для записи. По умолчанию дочерний процесс наследует поток вывода родителя.File stderrПоток стандартной ошибки дочернего процесса. Это может быть любой std.stdio.File, открытый для записи. По умолчанию дочерний процесс наследует поток ошибки родителя.string[string] envДополнительные переменные среды для дочернего процесса. Config configФлаги, управляющие созданием процесса. См. Configдля обзора доступных флагов.char[] workDirРабочий каталог для нового процесса. По умолчанию дочерний процесс наследует рабочий каталог родителя.
- Возвращает:
- Объект
Pid, соответствующий запущенному процессу.
- Исключения:
-
ProcessExceptionпри неудачном запуске процесса.
std.stdio.StdioExceptionпри неудаче передачи одного из потоков дочернему процессу (только Windows).
core.exception.RangeErrorеслиargsпусто.
- @safe Pid spawnShell(scope const(char)[] command, File stdin = std.stdio.stdin, File stdout = std.stdio.stdout, File stderr = std.stdio.stderr, scope const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null, scope string shellPath = nativeShell);
@trusted Pid spawnShell(scope const(char)[] command, scope const string[string] env, Config config = Config.none, scope const(char)[] workDir = null, scope string shellPath = nativeShell); -
Вариант функции
spawnProcess, который выполняет заданную команду через предпочтительный интерпретатор команд текущего пользователя (т.е. оболочку).Строка
commandпередаётся в оболочку буквально и поэтому подчиняется её правилам относительно структуры команд, цитирования аргументов/имен файлов и экранирования специальных символов. Путь к исполняемому файлу оболочки по умолчанию равенnativeShell.
Во всех остальных отношениях эта функция работает так же, как иspawnProcess. Обратитесь к документацииspawnProcessдля описаний других параметров функции, значения возврата и возможных исключений.// Run the command/program "foo" on the file named "my file.txt", and // redirect its output into foo.log. auto pid = spawnShell(`foo "my file.txt" > foo.log`); wait(pid);
- См. также:
-
escapeShellCommand, которая может быть полезна при построении правильно цитируемой и экранированной командной строки оболочки для текущей платформы.
- enum Config: int;
-
Флаги, контролирующие поведение функций создания процессов в этом модуле. Большинство флагов применяются только к функциям
spawnProcessиspawnShell.Используйте побитовое ИЛИ для объединения флагов.
- Пример
auto logFile = File("myapp_error.log", "w"); // Start program, suppressing the console window (Windows only), // redirect its error stream to logFile, and leave logFile open // in the parent process as well. auto pid = spawnProcess("myapp", stdin, stdout, logFile, Config.retainStderr | Config.suppressConsole); scope(exit) { auto exitCode = wait(pid); logFile.writeln("myapp exited with code ", exitCode); logFile.close(); }- newEnv
-
По умолчанию дочерний процесс наследует среду родителя, а любые переменные среды, переданные в
spawnProcess, будут добавлены к ней. Если этот флаг установлен, единственными переменными в среде дочернего процесса будут те, которые указаны для spawnProcess. -
retainStdin
retainStdout
retainStderr -
Если дочерний процесс не наследует стандартные потоки ввода/вывода/ошибок родителя, почти всегда необходимо закрывать эти потоки в родительском процессе, когда
spawnProcessвозвращает значение. Поэтому по умолчанию это делается. Если это нежелательно, передайте соответствующий параметр в spawnProcess. - suppressConsole
-
В Windows, если дочерний процесс — консольное приложение, этот флаг предотвратит создание консольного окна. В противном случае он будет проигнорирован. В POSIX
suppressConsoleне оказывает никакого влияния. - inheritFDs
-
В POSIX, открытые дескрипторы файлов по умолчанию наследуются дочерним процессом. Поскольку это может привести к скрытым ошибкам при использовании каналов или нескольких потоков,
spawnProcessгарантирует, что все дескрипторы файлов, кроме тех, которые соответствуют стандартному вводу/выводу/ошибке, будут закрыты в дочернем процессе при его запуске. ИспользуйтеinheritFDsдля предотвращения этого.В Windows этот параметр не имеет эффекта, и любые дескрипторы, которые были явно помечены как наследуемые, всегда будут унаследованы дочерним процессом.
- detached
-
Запустить процесс в откреплённом состоянии. Это избавляет от необходимости вызова
waitдля очистки ресурсов процесса.- Примечание
- Вызов
waitилиkillс полученнымPidнекорректен.
- stderrPassThrough
-
По умолчанию функции
executeиexecuteShellбудут捕获 дочерних процессов stdout и stderr. Это может быть нежелательно, если стандартный вывод должен быть обработан или использован вызывающей программой, так как результатexecuteбудет содержать смесь вывода и сообщений об ошибках/предупреждениях.Укажите этот флаг при вызове
executeилиexecuteShellдля того, чтобы поток stderr вызываемого процесса был отправлен вstd.stdio.stderr, и только захвачен и возвращён стандартный вывод.
Этот флаг не влияет наspawnProcessилиspawnShell.
- class Pid;
-
Дескриптор, соответствующий запущенному процессу.
- const pure nothrow @property @safe int processID();
-
Номер идентификатора процесса.
Это число, которое однозначно идентифицирует процесс в операционной системе, по крайней мере, до тех пор, пока процесс работает. После вызова
waitдляPidэтот метод вернёт недействительный (отрицательный) идентификатор процесса. - pure nothrow @nogc @property @safe pid_t osHandle();
-
Дескриптор процесса в операционной системе.
Этот дескриптор используется для указания процесса в специфичных для ОС API. В POSIX этот метод возвращает
core.sys.posix.sys.types.pid_tс тем же значением, что иPid.processID, а в Windows возвращаетcore.sys.windows.windows.HANDLE.
После вызоваwaitдляPidэтот метод вернёт недействительный дескриптор.
- @safe int wait(Pid pid);
-
Ожидает завершения процесса, связанного с
pid, и возвращает его код завершения.В общем случае, следует всегда ожидать завершения дочерних процессов перед завершением родительского процесса, если процесс не был запущен в отсоединённом режиме (с флагом
Config.detached). В противном случае, они могут стать «зомби» — процессами, которые неактивны, но всё ещё занимают слот в таблице процессов ОС. Не следует и не нужно ожидать завершения отсоединённых процессов, поскольку вы не владеете ими.
Если процесс уже завершился, эта функция возвращается сразу. Код завершения кешируется, так что если wait() вызывается несколько раз для одного и того жеPid, она всегда вернёт то же значение.- Специфично для POSIX
- Если процесс завершился по сигналу, эта функция возвращает отрицательное число, абсолютное значение которого равно номеру сигнала. Поскольку POSIX ограничивает обычные коды завершения диапазоном от 0 до 255, отрицательное значение всегда указывает на завершение по сигналу. Коды сигналов определены в модуле
core.sys.posix.signal(который соответствует POSIX заголовочному файлуsignal.h).
- Исключения:
-
ProcessExceptionпри ошибке или при попытке ожидать завершения отсоединённого процесса.
- Пример
- См. документацию
spawnProcess.
- См. также:
-
tryWaitдля неблокирующей функции.
- @safe auto tryWait(Pid pid);
-
Неблокирующая версия
wait.Если процесс, связанный с
pid, уже завершился, вызовtryWaitимеет точно такой же эффект, какwait. В этом случае она возвращает кортеж, где полеterminatedустановлено вtrue, а полеstatusимеет такое же толкование, как возвращаемое значениеwait.
Если процесс ещё не завершился, эта функция отличается отwaitтем, что не ждёт этого события, а возвращает значение немедленно. Полеterminatedвозвращаемого кортежа будет установлено вfalse, а полеstatusвсегда будет 0 (ноль).waitилиtryWaitследует затем вызвать снова для того жеPidв какой-то момент позже; не только для получения кода завершения, но и для предотвращения превращения процесса в «зомби», когда он, наконец, завершится. (См.waitдля подробностей).- Возвращает:
std.typecons.Tuple!(bool, "terminated", int, "status").
- Исключения:
-
ProcessExceptionпри ошибке или при попытке ожидать завершения отсоединённого процесса.
- Пример
auto pid = spawnProcess("dmd myapp.d"); scope(exit) wait(pid); ... auto dmd = tryWait(pid); if (dmd.terminated) { if (dmd.status == 0) writeln("Compilation succeeded!"); else writeln("Compilation failed"); } else writeln("Still compiling..."); ...Обратите внимание, что в этом примере первый вызовwaitне повлияет, если процесс уже завершился к моменту вызоваtryWait. Однако в противоположном случае, операторscopeгарантирует, что мы всегда ждём завершения процесса, если оно не завершилось к моменту достижения конца области видимости. - void kill(Pid pid);
void kill(Pid pid, int codeOrSignal); -
Попытка завершить процесс, связанный с
pid.Действие этой функции, а также значение
codeOrSignal, сильно зависят от платформы. Подробности приведены ниже. Общим для всех платформ является то, что эта функция только инициирует завершение процесса и возвращается немедленно. Она не ждёт завершения процесса и не гарантирует, что процесс фактически будет завершён.
Всегда вызывайтеwaitдля ожидания завершения процесса, даже еслиkillбыл вызван для него.- Специфично для Windows
- Процесс будет принудительно и резко завершён. Если
codeOrSignalуказан, он должен быть неотрицательным числом, которое будет использовано в качестве кода завершения процесса. Если нет, процесс завершится с кодом 1. Не используйтеcodeOrSignal = 259, так как это специальное значение (также известное как STILL_ACTIVE), используемое Windows для сигнализации о том, что процесс фактически ещё не завершился.
auto pid = spawnProcess("some_app"); kill(pid, 10); assert(wait(pid) == 10);- Специфично для POSIX
- Процессу будет отправлен сигнал со значением
codeOrSignal. В зависимости от отправленного сигнала, это может или не может привести к завершению процесса. Символьные константы для различных POSIX сигналов определены вcore.sys.posix.signal, что соответствует заголовочному файлуsignal.h. ЕслиcodeOrSignalопущено, будет отправлен сигналSIGTERM. (Это соответствует поведению команды оболочки_kill).
import core.sys.posix.signal : SIGKILL; auto pid = spawnProcess("some_app"); kill(pid, SIGKILL); assert(wait(pid) == -SIGKILL); // Negative return value on POSIX!- Исключения:
-
ProcessExceptionпри ошибке (например, если codeOrSignal некорректен) или при попытке завершить отсоединённый процесс. Обратите внимание, что невозможность завершить процесс считается «нормальным» результатом, а не ошибкой.
- @trusted Pipe pipe();
-
Создаёт однонаправленную трубу.
Данные записываются в один конец трубы и считываются с другого.
auto p = pipe(); p.writeEnd.writeln("Hello World"); p.writeEnd.flush(); assert(p.readEnd.readln().chomp() == "Hello World");Трубы, например, могут быть использованы для межпроцессного взаимодействия, запуска нового процесса и передачи одного конца трубы дочернему процессу, в то время как родительский процесс использует другой конец. (См. такжеpipeProcessиpipeShellдля более простого способа реализации.)// Use cURL to download the dlang.org front page, pipe its // output to grep to extract a list of links to ZIP files, // and write the list to the file "D downloads.txt": auto p = pipe(); auto outFile = File("D downloads.txt", "w"); auto cpid = spawnProcess(["curl", "http://dlang.org/download.html"], std.stdio.stdin, p.writeEnd); scope(exit) wait(cpid); auto gpid = spawnProcess(["grep", "-o", `http://\S*\.zip`], p.readEnd, outFile); scope(exit) wait(gpid);- Возвращает:
- Объект
Pipe, соответствующий созданной трубе.
- Исключения:
-
std.stdio.StdioExceptionпри ошибке.
- struct Pipe;
-
Интерфейс к трубе, созданной функцией
pipe.- nothrow @property @safe File readEnd();
-
Конец трубы для чтения.
- nothrow @property @safe File writeEnd();
-
Конец трубы для записи.
- @safe void close();
-
Закрывает оба конца трубы.
Обычно нет необходимости делать это вручную, так как объекты
std.stdio.Fileавтоматически закрываются, когда на них больше нет ссылок.
Обратите внимание, что если любой конец трубы был передан дочернему процессу, он будет закрыт только в родительском процессе. (Что происходит в дочернем процессе, зависит от платформы.)- Исключения:
-
std.exception.ErrnoExceptionпри возникновении ошибки.
- @safe ProcessPipes pipeProcess(scope const(char[])[] args, Redirect redirect = Redirect.all, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null);
@safe ProcessPipes pipeProcess(scope const(char)[] program, Redirect redirect = Redirect.all, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null);
@safe ProcessPipes pipeShell(scope const(char)[] command, Redirect redirect = Redirect.all, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null, string shellPath = nativeShell);
-
Запускает новый процесс, создавая каналы для перенаправления стандартных потоков ввода, вывода и/или ошибок.
pipeProcessиpipeShellявляются удобными оболочками вокругspawnProcessиspawnShellсоответственно, и автоматизируют задачу перенаправления одного или нескольких стандартных потоков дочернего процесса через каналы. Подобно обернутым функциям, эти функции возвращают немедленно, оставляя дочерний процесс для выполнения параллельно с вызывающим процессом. Рекомендуется всегда вызыватьwaitна возвращённомProcessPipes.pid, как подробно описано в документации дляwait.
Параметрыargs/program/command,envиconfigпередаются непосредственно в основополагающие функции запуска, и мы рекомендуем обратиться к их документации для получения подробностей.- Параметры:
const(char[])[] argsМассив, содержащий имя программы в качестве нулевого элемента и любые аргументы командной строки в последующих элементах. (См. spawnProcessдля подробностей.)const(char)[] programИмя программы без аргументов командной строки. (См. spawnProcessдля подробностей.)const(char)[] commandКоманда оболочки, которая передаётся в командный интерпретатор без изменений. (См. spawnShellдля подробностей.)Перенаправление redirectФлаги, определяющие, какие потоки перенаправляются и как. См. Redirectдля обзора доступных флагов.string[string] envДополнительные переменные окружения для дочернего процесса. (См. spawnProcessдля подробностей.)Config configФлаги, управляющие созданием процесса. См. Configдля обзора доступных флагов, и обратите внимание, что флагиretainStd...не имеют эффекта в этой функции.const(char)[] workDirРабочий каталог для нового процесса. По умолчанию дочерний процесс наследует рабочий каталог родительского процесса. string shellPathПуть к оболочке, которая будет использоваться для запуска указанной программы. По умолчанию это nativeShell.
- Возвращает:
- Объект
ProcessPipes, который содержит дескрипторыstd.stdio.Fileдля связи с перенаправленными потоками дочернего процесса, а также объектPid, соответствующий запущенному процессу.
- Выбрасывает:
-
ProcessExceptionпри неудачном запуске процесса.
std.stdio.StdioExceptionпри неудачном перенаправлении любого из потоков.
- Пример
// my_application writes to stdout and might write to stderr auto pipes = pipeProcess("my_application", Redirect.stdout | Redirect.stderr); scope(exit) wait(pipes.pid); // Store lines of output. string[] output; foreach (line; pipes.stdout.byLine) output ~= line.idup; // Store lines of errors. string[] errors; foreach (line; pipes.stderr.byLine) errors ~= line.idup; // sendmail expects to read from stdin pipes = pipeProcess(["/usr/bin/sendmail", "-t"], Redirect.stdin); pipes.stdin.writeln("To: you"); pipes.stdin.writeln("From: me"); pipes.stdin.writeln("Subject: dlang"); pipes.stdin.writeln(""); pipes.stdin.writeln(message); // a single period tells sendmail we are finished pipes.stdin.writeln("."); // but at this point sendmail might not see it, we need to flush pipes.stdin.flush(); // sendmail happens to exit on ".", but some you have to close the file: pipes.stdin.close(); // otherwise this wait will wait forever wait(pipes.pid); - перечисление Redirect: int;
-
Флаги, которые могут быть переданы функциям
pipeProcessиpipeShellдля указания того, какие стандартные потоки дочернего процесса перенаправляются. Используйте побитовое ИЛИ для объединения флагов.-
stdin
stdout
stderr -
Перенаправить стандартный поток ввода, вывода или ошибок соответственно.
- all
-
Перенаправить все три потока. Это эквивалентно
Redirect.stdin | Redirect.stdout | Redirect.stderr. - stderrToStdout
-
Перенаправить поток стандартной ошибки в поток стандартного вывода. Это нельзя комбинировать с
Redirect.stderr. - stdoutToStderr
-
Перенаправить поток стандартного вывода в поток стандартной ошибки. Это нельзя комбинировать с
Redirect.stdout.
-
stdin
- структура ProcessPipes;
-
Объект, содержащий дескрипторы
std.stdio.File, которые позволяют общаться с дочерним процессом через его стандартные потоки.- nothrow @property @safe Pid pid();
-
Идентификатор процесса (
Pid) дочернего процесса. - nothrow @property @safe File stdin();
-
Объект
std.stdio.File, который позволяет писать в стандартный поток ввода дочернего процесса.- Выбрасывает:
-
Error, если стандартный поток ввода дочернего процесса не был перенаправлен.
- nothrow @property @safe File stdout();
-
Объект
std.stdio.File, который позволяет читать из стандартного потока вывода дочернего процесса.- Выбрасывает:
-
Error, если стандартный поток вывода дочернего процесса не был перенаправлен.
- nothrow @property @safe File stderr();
-
Объект
std.stdio.File, который позволяет читать из стандартного потока ошибок дочернего процесса.- Выбрасывает:
-
Error, если стандартный поток ошибок дочернего процесса не был перенаправлен.
- @safe auto execute(scope const(char[])[] args, const string[string] env = null, Config config = Config.none, size_t maxOutput = size_t.max, scope const(char)[] workDir = null);
@safe auto execute(scope const(char)[] program, const string[string] env = null, Config config = Config.none, size_t maxOutput = size_t.max, scope const(char)[] workDir = null);
@safe auto executeShell(scope const(char)[] command, const string[string] env = null, Config config = Config.none, size_t maxOutput = size_t.max, scope const(char)[] workDir = null, string shellPath = nativeShell); -
Выполняет заданную программу или командную строку оболочки и возвращает её код выхода и вывод.
executeиexecuteShellзапускают новый процесс, используяspawnProcessиspawnShellсоответственно, и ожидают завершения процесса перед возвратом. Функции захватывают то, что дочерний процесс печатает в потоки стандартного вывода и стандартной ошибки, и возвращают это вместе с кодом выхода.auto dmd = execute(["dmd", "myapp.d"]); if (dmd.status != 0) writeln("Compilation failed:\n", dmd.output); auto ls = executeShell("ls -l"); if (ls.status != 0) writeln("Failed to retrieve file listing"); else writeln(ls.output);
Параметрыargs/program/command,envиconfigпередаются непосредственно в основополагающие функции запуска, и мы рекомендуем обратиться к их документации для получения подробностей.- Параметры:
const(char[])[] argsМассив, содержащий имя программы в качестве нулевого элемента и любые аргументы командной строки в последующих элементах. (См. spawnProcessдля подробностей.)const(char)[] programИмя программы без аргументов командной строки. (См. spawnProcessдля подробностей.)const(char)[] commandКоманда оболочки, которая передаётся в командный интерпретатор без изменений. (См. spawnShellдля подробностей.)string[string] envДополнительные переменные окружения для дочернего процесса. (См. spawnProcessдля подробностей.)Config configФлаги, управляющие созданием процесса. См. Configдля обзора доступных флагов, и обратите внимание, что флагиretainStd...не имеют эффекта в этой функции.size_t maxOutputМаксимальное количество байтов вывода, которое должно быть захвачено. const(char)[] workDirРабочий каталог для нового процесса. По умолчанию дочерний процесс наследует рабочий каталог родительского процесса. string shellPathПуть к оболочке, которая будет использоваться для запуска указанной программы. По умолчанию это nativeShell.
- Возвращает:
std.typecons.Tuple!(int, "status", string, "output").
- POSIX-специфичные
- Если процесс завершается сигналом, поле
statusвозвращаемого значения будет содержать отрицательное число, модуль которого равен номеру сигнала. (См.waitдля подробностей.)
- Выбрасывает:
-
ProcessExceptionпри неудачном запуске процесса.
std.stdio.StdioExceptionпри неудачном захвате вывода.
- класс ProcessException: object.Exception;
-
Исключение, сигнализирующее о проблеме с запуском или ожиданием процесса.
- @property @safe string userShell();
-
Определяет путь к предпочтительному интерпретатору команд текущего пользователя.
В Windows эта функция возвращает содержимое переменной окружения COMSPEC, если она существует. В противном случае она возвращает результат
nativeShell.
В POSIX,userShellвозвращает содержимое переменной окружения SHELL, если она существует и не пуста. В противном случае она возвращает результатnativeShell. - pure nothrow @nogc @property @safe string nativeShell();
-
Путь к платформенно-специфической родной оболочке.
Эта функция возвращает
"cmd.exe"в Windows,"/bin/sh"в POSIX и"/system/bin/sh"в Android. - pure @safe string escapeShellCommand(scope const(char[])[] args...);
-
Выполняет экранирование массива аргументов в стиле argv для использования с
spawnShell,pipeShellилиexecuteShell.string url = "http://dlang.org/"; executeShell(escapeShellCommand("wget", url, "-O", "dlang-index.html"));Объединяет результаты нескольких
escapeShellCommandиescapeShellFileNameдля использования операторов перенаправления оболочки или конвейеров.executeShell( escapeShellCommand("curl", "http://dlang.org/download.html") ~ "|" ~ escapeShellCommand("grep", "-o", `http://\S*\.zip`) ~ ">" ~ escapeShellFileName("D download links.txt"));- Выбрасывает:
-
Exception, если любая часть командной строки содержит неэкранируемые символы (NUL на всех платформах, а также CR и LF в Windows).
- pure nothrow @trusted string escapeWindowsArgument(scope const(char)[] arg);
-
Приводит аргумент командной строки в соответствие с поведением CommandLineToArgvW.
- pure nothrow @trusted string escapeShellFileName(scope const(char)[] fileName);
-
Экранирует имя файла для использования в перенаправлении оболочки с
spawnShell,pipeShellилиexecuteShell. - int execv(in string pathname, in string[] argv);
int execve(in string pathname, in string[] argv, in string[] envp);
int execvp(in string pathname, in string[] argv);
int execvpe(in string pathname, in string[] argv, in string[] envp); -
Заменяет текущий процесс, выполняя команду
pathname, с аргументами вargv.Эта функция доступна только для Posix.
Обычно, первый элементargv— это выполняемая команда, т.е.argv[0] == pathname. Варианты функцийexecс суффиксом 'p' ищут команду в переменной окружения PATHpathname. Варианты функций с суффиксом 'e' дополнительно принимают переменные окружения нового процесса в виде массива строк вида ключ=значение.
Не возвращает значение при успешном выполнении (текущий процесс будет заменён). Возвращает -1 при неудаче без указания причины ошибки.- Специфика Windows
- Эти функции поддерживаются только на платформах Posix, так как операционные системы Windows не предоставляют возможности перезаписи текущего образа процесса другим. В однопоточных программах можно приблизительно имитировать эффект
execv*с помощьюspawnProcessи завершения текущего процесса после возвращения дочернего процесса. Например:
auto commandLine = [ "program", "arg1", "arg2" ]; version (Posix) { execv(commandLine[0], commandLine); throw new Exception("Failed to execute program"); } else version (Windows) { import core.stdc.stdlib : _Exit; _Exit(wait(spawnProcess(commandLine))); }Это, однако, НЕ эквивалентно POSIXexecv*. Во-первых, выполняемая программа запускается как отдельный процесс, со всеми вытекающими последствиями. Во-вторых, в многопоточной программе другие потоки продолжат работу, в то время как текущий поток ожидает завершения дочернего процесса. Лучшим вариантом может иногда быть немедленное завершение текущей программы после запуска дочернего процесса. Такое поведение демонстрируют функции__execв библиотеке C Runtime от Microsoft, и так работают устаревшие функции Windowsexecv*D. Пример:auto commandLine = [ "program", "arg1", "arg2" ]; version (Posix) { execv(commandLine[0], commandLine); throw new Exception("Failed to execute program"); } else version (Windows) { spawnProcess(commandLine); import core.stdc.stdlib : _exit; _exit(0); } - void browse(scope const(char)[] url);
-
Запустить браузер и установить его для просмотра страницы по адресу url.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_process.html