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 содержит идентификатор процесса командной оболочки, запущенной для выполнения команды.
Используемая для выполнения команд оболочка зависит от операционной системы. Обычно в системах UNIX это /bin/sh, а в системах Windows — cmd.exe.
-
: 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.
Примечание по программированию: в системах UNIX сценарий выполняется с помощью
python3, а в Windows — с помощьюpython. Эти значения по умолчанию можно переопределить, задав переменную окруженияPYTHON, например из Octave с помощьюsetenv PYTHON /usr/local/bin/python3.
-
:
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.
-
:
status =pclose(fid) -
Закрыть идентификатор файла fid, открытый функцией
popen.В случае успеха функция
fcloseвозвращает 0, в противном случае — -1.Примечание по программированию: для той же цели можно использовать и функцию
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Обратите внимание: в отличие от
popen, функцияpopen2не «собирает» дочерний процесс. Если не использоватьwaitpidдля проверки кода завершения дочернего процесса, он будет оставаться активным до завершения Octave.
-
:
val =EXEC_PATH() -
:
old_val =EXEC_PATH(new_val) -
:
old_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.
-
:
v =WCONTINUE() -
Вернуть числовое значение макроса
WCONTINUE.WCONTINUE— это аргумент параметров, который можно передать функцииwaitpid, чтобы указать, что она также должна возвращать управление, если остановленный дочерний процесс был возобновлён при доставке сигналаSIGCONT.
-
:
tf =WCOREDUMP(status) -
Получив значение status от вызова
waitpid, вернуть true, если дочерний процесс создал дамп памяти.Эту функцию следует использовать только в том случае, если
WIFSIGNALEDвернула true. Макрос, используемый для реализации этой функции, не определён в POSIX.1-2001 и недоступен в некоторых реализациях Unix (например, AIX и SunOS).См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
-
:
tf =WEXITSTATUS(status) -
Получив значение status от вызова
waitpid, вернуть код завершения дочернего процесса.Эту функцию следует использовать только в том случае, если
WIFEXITEDвернула true.См. также: waitpid, WIFEXITED, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
-
:
tf =WIFCONTINUED(status) -
Получив значение status от вызова
waitpid, вернуть true, если дочерний процесс был возобновлён при доставке сигналаSIGCONT.См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG.
-
:
tf =WIFSIGNALED(status) -
Получив значение status от вызова
waitpid, вернуть true, если дочерний процесс был завершён сигналом.См. также: waitpid, WIFEXITED, WEXITSTATUS, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
-
:
tf =WIFSTOPPED(status) -
Получив значение status от вызова
waitpid, вернуть true, если дочерний процесс был остановлен при доставке сигнала.Это возможно только в том случае, если вызов был выполнен с использованием
WUNTRACEDили если дочерний процесс отслеживается (см. ptrace(2)).См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WSTOPSIG, WIFCONTINUED.
-
:
tf =WIFEXITED(status) -
Получив значение status от вызова
waitpid, вернуть true, если дочерний процесс завершился штатно.См. также: waitpid, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
-
:
v =WNOHANG() -
Вернуть числовое значение макроса
WNOHANG.WNOHANG— это аргумент параметров, который можно передать функцииwaitpid, чтобы указать, что она должна немедленно вернуть состояние вместо ожидания завершения процесса.
-
:
tf =WSTOPSIG(status) -
Получив значение status от вызова
waitpid, вернуть номер сигнала, вызвавшего остановку дочернего процесса.Эту функцию следует использовать только в том случае, если
WIFSTOPPEDвернула true.См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WIFCONTINUED.
-
:
tf =WTERMSIG(status) -
Получив значение status от вызова
waitpid, вернуть номер сигнала, вызвавшего завершение дочернего процесса.Эту функцию следует использовать только в том случае, если
WIFSIGNALEDвернула true.См. также: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.
-
:
v =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 содержит зависящее от системы сообщение об ошибке.
-
:
S =SIG() Вернуть структуру, содержащую имена сигналов Unix и соответствующие им определённые значения.
© 1996–2026 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/v9.4.0/Controlling-Subprocesses.html