36.5 Управление подпроцессами
Octave включает в себя некоторые высокоуровневые команды, такие как system и popen для запуска подпроцессов. Если вы хотите запустить другую программу для выполнения какой-либо задачи, а затем посмотреть её вывод, вы, вероятно, захотите использовать эти функции.
Octave также предоставляет несколько очень низкоуровневых функций, похожих на Unix, которые также могут использоваться для запуска подпроцессов, но вы, вероятно, должны использовать их только в том случае, если вы не можете найти способ сделать то, что вам нужно, с помощью функций более высокого уровня.
- : system ("string") ¶
- : system ("string", return_output) ¶
- : system ("string", return_output, type) ¶
- : [status, output] = system (…) ¶
-
Выполняет командную строку, указанную в string.
Если system вызывается с одним или несколькими выходными аргументами, или если необязательный аргумент return_output имеет значение true, и подпроцесс запущен синхронно, то вывод команды возвращается как переменная. В противном случае, если подпроцесс выполняется синхронно, его вывод отправляется на стандартный вывод. Чтобы отправить вывод команды, выполненной с
system, через средство просмотра, используйте команду вида[~, text] = system ("cmd"); more on; disp (text);или
more on; printf ("%s\n", nthargout (2, "system", "cmd"));Если необязательный аргумент type равен
"async", процесс запускается в фоновом режиме, и идентификатор процесса дочернего процесса возвращается немедленно. В противном случае дочерний процесс запускается, и Octave ожидает его завершения. Если аргумент type опущен, он по умолчанию принимает значение"sync".Функция
systemможет возвращать два значения. Первое — это код завершения команды, а второе — любой вывод команды, который был записан в стандартный поток вывода. Например,[status, output] = system ("echo foo & exit 2");установит переменную output в строку ‘foo’, а переменную status в целое число ‘2’.
Для асинхронно запущенных команд status — это идентификатор процесса командной оболочки, которая запущена для выполнения команды.
Оболочка, используемая для выполнения команд, зависит от операционной системы и обычно является /bin/sh для систем UNIX и cmd.exe для систем Windows.
- : unix ("command") ¶
- : status = unix ("command") ¶
- : [status, text] = unix ("command") ¶
- : […] = unix ("command", "-echo") ¶
-
Выполняет системную команду, если работает в операционной системе, подобной Unix, в противном случае ничего не делает.
Octave ожидает завершения внешней команды, прежде чем возвращать код завершения программы в status и любой вывод в text.
При вызове без выходного аргумента или при задании аргумента
"-echo", text также отправляется на стандартный вывод.
- : dos ("command") ¶
- : status = dos ("command") ¶
- : [status, text] = dos ("command") ¶
- : […] = dos ("command", "-echo") ¶
-
Выполняет системную команду, если работает в операционной системе, подобной Windows, в противном случае ничего не делает.
Octave ожидает завершения внешней команды, прежде чем возвращать код завершения программы в status и любой вывод в text.
При вызове без выходного аргумента или при задании аргумента
"-echo", text также отправляется на стандартный вывод.
- : open file ¶
- : output = open (file) ¶
-
Открывает файл file в Octave или во внешнем приложении на основе типа файла, определяемого расширением имени файла.
По умолчанию распознаются типы файлов:
.m-
Открыть файл в редакторе. Значение output не возвращается.
.matoctave-workspace-
Открыть файл данных с помощью
load. Если значение возврата output не запрашивается, переменные загружаются в базовое рабочее пространство. В противном случае output будет структурой, содержащей загруженные данные. См. функцию load. .ofig-
Открыть рисунок с помощью
hgload. См. функцию hgload. .fig, .ofig-
Загрузить рисунок
.exeВыполнить программу (только в системах Windows). Значение output не возвращается.
Пользовательские расширения файлов также могут обрабатываться, если функция
openxxx, гдеxxx— это расширение, найдена в пути загрузки. Функция должна принимать имя файла в качестве входных данных. Например, для загрузки файлов данных".dat"в базовое рабочее пространство, как это делается по умолчанию для файлов".mat", можно определить"opendat.m"со следующим содержимым:function retval = opendat (fname) evalin ("base", sprintf ("load ('%s');", fname)); endfunctionДругие типы файлов открываются в соответствующем внешнем приложении.
- : output = perl (scriptfile) ¶
- : output = perl (scriptfile, argument1, argument2, …) ¶
- : [output, status] = perl (…) ¶
-
Вызывает скрипт Perl scriptfile, возможно, со списком аргументов командной строки.
Возвращает вывод в output и необязательный статус в status. Если scriptfile не является абсолютным именем файла, он ищется в текущем каталоге, а затем в пути загрузки Octave.
- : output = python (scriptfile) ¶
- : output = python (scriptfile, argument1, argument2, …) ¶
- : [output, status] = python (…) ¶
-
Вызывает скрипт Python scriptfile, возможно, со списком аргументов командной строки.
Возвращает вывод в output и необязательный статус в status. Если scriptfile не является абсолютным именем файла, он ищется в текущем каталоге, а затем в пути загрузки Octave.
- : fid = popen (command, mode) ¶
-
Запускает процесс и создаёт канал.
Имя команды для запуска задаётся в command. Аргумент mode может быть:
"r"-
Канал будет подключен к стандартному выводу процесса и открыт для чтения.
"w"Канал будет подключен к стандартному вводу процесса и открыт для записи.
Идентификатор файла, соответствующий входному или выходному потоку процесса, возвращается в fid.
Например:
fid = popen ("ls -ltr / | tail -3", "r"); while (ischar (s = fgets (fid))) fputs (stdout, s); endwhile -| drwxr-xr-x 33 root root 3072 Feb 15 13:28 etc -| drwxr-xr-x 3 root root 1024 Feb 15 13:28 lib -| drwxrwxrwt 15 root root 2048 Feb 17 14:53 tmpСм. также: popen2.
- : pclose (fid) ¶
-
Закрыть идентификатор файла, который был открыт функцией
popen.Функция
fcloseтакже может использоваться для этой же цели.
- : [in, out, pid] = popen2 (command, args) ¶
-
Запуск дочернего процесса с двусторонней связью.
Имя процесса задаётся параметром command, а args — массив или ячейковый массив строк, содержащих опции для команды.
Идентификаторы файлов для входного и выходного потоков дочернего процесса возвращаются в in и out соответственно. Если выполнение команды прошло успешно, pid содержит идентификатор процесса дочернего процесса. В противном случае pid равно -1.
Например:
[in, out, pid] = popen2 ("sort", "-r"); fputs (in, "these\nare\nsome\nstrings\n"); fclose (in); EAGAIN = errno ("EAGAIN"); done = false; do s = fgets (out); if (ischar (s)) fputs (stdout, s); elseif (errno () == EAGAIN) pause (0.1); fclear (out); else done = true; endif until (done) fclose (out); waitpid (pid); -| these -| strings -| some -| areОбратите внимание, что
popen2, в отличие отpopen, не «собирает» дочерний процесс. Если вы не используетеwaitpid, чтобы проверить статус выхода дочернего процесса, он будет ожидать завершения Octave.
- : val = EXEC_PATH () ¶
- : old_val = EXEC_PATH (new_val) ¶
- : EXEC_PATH (new_val, "local") ¶
-
Запрос или установка внутренней переменной, которая определяет список директорий, разделённых двоеточием, которые нужно добавить к переменной окружения PATH при выполнении внешних программ.
Начальное значение берётся из переменной окружения
OCTAVE_EXEC_PATH, но это значение может быть переопределено аргументом командной строки --exec-path PATH.При вызове изнутри функции с опцией
"local", переменная изменяется локально для функции и всех вызываемых ею подпрограмм. Исходное значение переменной восстанавливается при выходе из функции.См. также: IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME.
В большинстве случаев, следующие функции просто декодируют свои аргументы и выполняют соответствующие системные вызовы Unix. Для полного примера их использования посмотрите на определение функции popen2.
- : [pid, msg] = fork () ¶
-
Создать копию текущего процесса.
Функция fork может вернуть одно из следующих значений:
- > 0
-
Вы находитесь в родительском процессе. Возвращаемое значение из
fork— идентификатор процесса дочернего процесса. Вам, вероятно, следует организовать ожидание завершения любых дочерних процессов. - 0
-
Вы находитесь в дочернем процессе. Вы можете вызвать
execдля запуска другого процесса. Если это не удалось, вам, вероятно, следует вызватьexit. - < 0
Вызов
forkзавершился неудачей по какой-то причине. Вам необходимо принять меры. Сообщение об ошибке, зависящее от системы, будет ожидать в msg.
- : [err, msg] = exec (file, args) ¶
-
Замена текущего процесса новым процессом.
Вызов
execбез предварительного вызоваforkзавершит текущий процесс Octave и заменит его программой, имя которой указано в file. Например,exec ("ls", "-l")выполнит
lsи вернёт вас к вашей командной строке.Если выполнение прошло успешно,
execне возвращает значение. Еслиexecвозвращает значение, err будет ненулевым, а msg будет содержать сообщение об ошибке, зависящее от системы.
- : [read_fd, write_fd, err, msg] = pipe () ¶
-
Создать канал и вернуть концы чтения и записи канала соответственно в read_fd и write_fd.
Если выполнение прошло успешно, err равно 0, а msg — пустая строка. В противном случае err ненулевое, а msg содержит сообщение об ошибке, зависящее от системы.
См. также: mkfifo.
- : [fid, msg] = dup2 (old, new) ¶
-
Дублировать дескриптор файла.
Если выполнение прошло успешно, fid больше нуля и содержит новый идентификатор файла. В противном случае fid меньше нуля, а msg содержит сообщение об ошибке, зависящее от системы.
- : [pid, status, msg] = waitpid (pid, options) ¶
-
Ожидание завершения процесса pid.
Аргумент pid может быть:
- -1
-
Ожидание любого дочернего процесса.
- 0
-
Ожидание любого дочернего процесса, идентификатор группы процесса которого равен идентификатору группы процесса интерпретатора Octave.
- > 0
Ожидание завершения дочернего процесса с идентификатором pid.
Аргумент options может быть побитовым ИЛИ нуля или более следующих констант:
0-
Ожидание получения сигнала или завершения дочернего процесса (это значение по умолчанию, если аргумент options отсутствует).
WNOHANG-
Не зависать, если статус не доступен немедленно.
WUNTRACED-
Отразить статус любых приостановленных дочерних процессов, статус которых ещё не был отслежен с момента остановки.
WCONTINUEВозвратить, если приостановленный дочерний процесс был возобновлён доставкой
SIGCONT. Это значение может не иметь смысла на всех системах.
Если возвращаемое значение pid больше 0, это идентификатор процесса дочернего процесса, который завершился. Если произошла ошибка, pid будет меньше нуля, а msg будет содержать сообщение об ошибке, зависящее от системы. Значение status содержит дополнительную информацию, зависящую от системы, о завершившемся дочернем процессе.
См. также: WCONTINUE, WCOREDUMP, WEXITSTATUS, WIFCONTINUED, WIFSIGNALED, WIFSTOPPED, WNOHANG, WSTOPSIG, WTERMSIG, WUNTRACED.
- : WCONTINUE () ¶
-
Возвратить числовое значение макроса
WCONTINUE.WCONTINUE— аргумент опции, который может быть переданwaitpidдля указания, что он также должен возвратить значение, если приостановленный дочерний процесс был возобновлён доставкой сигналаSIGCONT.
- : WCOREDUMP (status) ¶
-
Дано status из вызова
waitpid, вернуть true, если дочерний процесс создал дамп ядра.Эта функция должна использоваться только если
WIFSIGNALEDвернула true. Макрос, используемый для реализации этой функции, не определён в POSIX.1-2001 и недоступен на некоторых реализациях Unix (например, AIX, SunOS).См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
- : WEXITSTATUS (status) ¶
-
Дано status из вызова
waitpid, вернуть код выхода дочернего процесса.Эта функция должна использоваться только если
WIFEXITEDвернула true.См. также: waitpid, WIFEXITED, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
- : WIFCONTINUED (status) ¶
-
При получении значения status от вызова
waitpid, возвращает true, если дочерний процесс был возобновлён после полученияSIGCONT.См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG.
- : WIFSIGNALED (status) ¶
-
При получении значения status от вызова
waitpid, возвращает true, если дочерний процесс был завершён по сигналу.См. также: waitpid, WIFEXITED, WEXITSTATUS, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
- : WIFSTOPPED (status) ¶
-
При получении значения status от вызова
waitpid, возвращает true, если дочерний процесс был остановлен по сигналу.Это возможно только если вызов был выполнен с использованием
WUNTRACEDили когда дочерний процесс отслеживается (см. ptrace(2)).См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WSTOPSIG, WIFCONTINUED.
- : WIFEXITED (status) ¶
-
При получении значения status от вызова
waitpid, возвращает true, если дочерний процесс завершился нормально.См. также: waitpid, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
- : WNOHANG () ¶
-
Возвращает числовое значение макроса
WNOHANG.WNOHANG— это аргумент опции, который может быть передан вwaitpid, чтобы указать, что функция должна вернуть состояние сразу же, вместо ожидания завершения процесса.
- : WSTOPSIG (status) ¶
-
При получении значения status от вызова
waitpid, возвращает номер сигнала, который вызвал остановку дочернего процесса.Эта функция должна быть использована только если
WIFSTOPPEDвернуло true.См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WIFCONTINUED.
- : WTERMSIG (status) ¶
-
При получении значения status от вызова
waitpid, возвращает номер сигнала, который привёл к завершению дочернего процесса.Эта функция должна быть использована только если
WIFSIGNALEDвернуло true.См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
- : WUNTRACED () ¶
-
Возвращает числовое значение макроса
WUNTRACED.WUNTRACED— это аргумент опции, который может быть передан вwaitpid, чтобы указать, что функция также должна вернуть состояние, если дочерний процесс остановлен, но не отслеживается через системный вызовptrace.
- : fcntl (fid, request, arg) ¶
- : [status, msg] = fcntl (fid, request, arg) ¶
-
Изменяет свойства открытого файла fid.
Следующие значения могут быть переданы в качестве request:
F_DUPFD¶-
Возвращает дубликат дескриптора файла.
F_GETFD¶-
Возвращает флаги дескриптора файла для fid.
F_SETFD¶-
Устанавливает флаги дескриптора файла для fid.
F_GETFL¶-
Возвращает флаги состояния файла для fid. Могут быть возвращены следующие коды (некоторые флаги могут быть не определены на некоторых системах).
O_RDONLY¶-
Открыт только для чтения.
O_WRONLY¶-
Открыт только для записи.
O_RDWR¶-
Открыт для чтения и записи.
O_APPEND¶-
При каждой записи добавляется в конец.
O_CREAT¶-
Создать файл, если он не существует.
O_NONBLOCK¶-
Режим без блокировки.
O_SYNC¶-
Ожидать завершения записей.
O_ASYNC¶Асинхронный ввод-вывод.
F_SETFL¶Устанавливает флаги состояния файла для fid в значение, указанное в arg. Изменить можно только флаги
O_APPENDиO_NONBLOCK.
При успехе status равно 0, а msg — пустая строка. В противном случае status равно -1, а msg содержит сообщение об ошибке, зависящее от системы.
- : kill (pid, sig) ¶
- : [status, msg] = kill (pid, sig) ¶
-
Отправка сигнала sig процессу pid.
Если pid положительно, то сигнал sig отправляется процессу pid.
Если pid равно 0, то сигнал sig отправляется всем процессам в группе процессов текущего процесса.
Если pid равно -1, то сигнал sig отправляется всем процессам, кроме процесса 1.
Если pid меньше -1, то сигнал sig отправляется всем процессам в группе процессов -pid.
Если sig равно 0, то сигнал не отправляется, но проверка ошибок всё ещё выполняется.
При успехе status равно 0, а msg — пустая строка. В противном случае status равно -1, а msg содержит сообщение об ошибке, зависящее от системы.
- : SIG () ¶
Возвращает структуру, содержащую имена сигналов Unix и их определённые значения.
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/Controlling-Subprocesses.html