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.
Замечание о программировании: в системах 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Обратите внимание, что
popen2, в отличие отpopen, не будет «собирать» дочерний процесс. Если вы не используете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
Ожидать завершения дочернего процесса с ID 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–2023 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/v8.1.0/Controlling-Subprocesses.html