36.5 Управление дочерними процессами
Octave включает некоторые высокоуровневые команды, такие как system и popen, для запуска дочерних процессов. Если вы хотите запустить другую программу для выполнения некоторой задачи и затем посмотреть её вывод, вам, вероятно, понадобятся эти функции.
Octave также предоставляет несколько функций низкого уровня, подобных функциям Unix, которые также могут быть использованы для запуска дочерних процессов, но вы, вероятно, должны использовать их только в том случае, если не можете найти способ сделать необходимое с помощью высокоуровневых функций.
- : system ("строка")
- : system ("строка", возвращать_вывод)
- : system ("строка", возвращать_вывод, тип)
- : [статус, вывод] = system (…)
-
Выполняет командную строку, заданную строкой.
Если функция system вызывается с одним или несколькими аргументами вывода, или если необязательный аргумент возвращать_вывод равен true и дочерний процесс запускается синхронно, то вывод команды возвращается как переменная. В противном случае, если дочерний процесс выполняется синхронно, его вывод передаётся в стандартный вывод. Для перенаправления вывода команды, выполненной с помощью
system, через просмотрщик страниц, используйте команду, подобную[~, text] = system ("cmd"); more on; disp (text);или
more on; printf ("%s\n", nthargout (2, "system", "cmd"));Если необязательный аргумент тип равен
"async", процесс запускается в фоновом режиме, и идентификатор процесса дочернего процесса возвращается немедленно. В противном случае дочерний процесс запускается, и Octave ожидает его завершения. Если аргумент тип опущен, он принимает значение"sync".Функция
systemможет возвращать два значения. Первое — это код завершения команды, а второе — любой вывод команды, который был записан в поток стандартного вывода. Например,[status, output] = system ("echo foo & exit 2");присвоит переменной вывод строку ‘foo’, а переменной статус целое число ‘2’.
Для команд, выполняемых асинхронно, статус — это идентификатор процесса командной оболочки, запущенной для выполнения команды.
Оболочка, используемая для выполнения команд, зависит от операционной системы и обычно составляет /bin/sh для систем Unix и cmd.exe для систем Windows.
- : unix ("команда")
- : статус = unix ("команда")
- : [статус, текст] = unix ("команда")
- : […] = unix ("команда", "-echo")
-
Выполняет системную команду, если выполняется под операционной системой типа Unix, в противном случае ничего не делает.
Octave ожидает завершения внешней команды, прежде чем вернуть код завершения программы в статус и любой вывод в текст.
Если вызывается без аргумента вывода или задан аргумент
"-echo", тогда текст также передаётся в стандартный вывод.
- : dos ("команда")
- : статус = dos ("команда")
- : [статус, текст] = dos ("команда")
- : […] = dos ("команда", "-echo")
-
Выполняет системную команду, если выполняется под операционной системой типа Windows, в противном случае ничего не делает.
Octave ожидает завершения внешней команды, прежде чем вернуть код завершения программы в статус и любой вывод в текст.
Если вызывается без аргумента вывода или задан аргумент
"-echo", тогда текст также передаётся в стандартный вывод.
- : open файл
- : вывод = open (файл)
-
Открывает файл файл в Octave или во внешнем приложении, основанном на типе файла, определяемом расширением имени файла.
По умолчанию распознаваемые типы файлов:
.m-
Открыть файл в редакторе. Значение вывод не возвращается.
.matoctave-workspace-
Открыть файл данных с помощью
load. Если значение возврата вывод не затребовано, переменные загружаются в рабочую область базового уровня. В противном случае вывод будет структурой, содержащей загруженные данные. См. функцию load. .ofig-
Открыть график с помощью
hgload. См. функцию hgload. .fig, .ofig-
Загрузить график
.exeВыполнить программу (только для систем Windows). Значение вывод не возвращается.
Также могут обрабатываться пользовательские расширения файлов, если в пути загрузки найдена функция
openxxx, гдеxxx— расширение. Функция должна принимать имя файла в качестве входного значения. Например, для загрузки файлов данных".dat"в рабочую область базового уровня, как это делается по умолчанию для файлов".mat", можно определить"opendat.m"со следующим содержимым:function retval = opendat (fname) evalin ("base", sprintf ("load ('%s');", fname)); endfunctionДругие типы файлов открываются в соответствующем внешнем приложении.
- : вывод = perl (скриптфайл)
- : вывод = perl (скриптфайл, аргумент1, аргумент2, …)
- : [вывод, статус] = perl (…)
-
Вызывает Perl-скрипт скриптфайл, возможно, с списком аргументов командной строки.
Возвращает вывод в вывод и необязательный статус в статус. Если скриптфайл не является абсолютным именем файла, он ищется в текущей директории, а затем в пути загрузки Octave.
- : вывод = python (скриптфайл)
- : вывод = python (скриптфайл, аргумент1, аргумент2, …)
- : [вывод, статус] = python (…)
-
Вызывает Python-скрипт скриптфайл, возможно, со списком аргументов командной строки.
Возвращает вывод в вывод и необязательный статус в статус. Если скриптфайл не является абсолютным именем файла, он ищется в текущей директории, а затем в пути загрузки Octave.
- : указатель_файла = popen (команда, режим)
-
Запускает процесс и создаёт канал.
Имя команды для выполнения задаётся команда. Аргумент режим может быть
"r"-
Канал будет подключен к стандартному выводу процесса и открыт для чтения.
"w"Канал будет подключен к стандартному вводу процесса и открыт для записи.
Идентификатор файла, соответствующий потоку ввода или вывода процесса, возвращается в указатель_файла.
Например:
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 (указатель_файла)
-
Закрывает идентификатор файла, открытый с помощью
popen.Функция
fcloseтакже может быть использована для той же цели.
- : [вход, выход, идентификатор_процесса] = popen2 (команда, аргументы)
-
Запускает дочерний процесс с двусторонней связью.
Имя процесса задаётся команда, а аргументы — массив или ячеистый массив строк, содержащих параметры для команды.
Идентификаторы файлов для потоков ввода и вывода дочернего процесса возвращаются в вход и выход. Если выполнение команды прошло успешно, идентификатор_процесса содержит идентификатор процесса дочернего процесса. В противном случае идентификатор_процесса равен -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.
- : значение = EXEC_PATH ()
- : старое_значение = EXEC_PATH (новое_значение)
- : EXEC_PATH (новое_значение, "локально")
-
Запрос или установка внутренней переменной, которая определяет список директорий, разделённых двоеточием, для добавления в переменную среды 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.
- : [err, 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.
При успешном выполнении err равно 0, а msg — пустая строка. В противном случае err отлично от нуля, а msg содержит сообщение об ошибке, зависящее от системы.
-
- : [err, msg] = kill (pid, sig)
-
Отправляет сигнал sig процессу pid.
Если pid положительно, то сигнал sig отправляется процессу pid.
Если pid равно 0, то сигнал sig отправляется каждому процессу в группе процессов текущего процесса.
Если pid равно -1, то сигнал sig отправляется каждому процессу, кроме процесса 1.
Если pid меньше -1, то сигнал sig отправляется каждому процессу в группе процессов -pid.
Если sig равно 0, то сигнал не отправляется, но проверка ошибок всё равно выполняется.
Возвращает 0 при успехе, в противном случае возвращает -1.
- : 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/v6.4.0/Controlling-Subprocesses.html