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.
-
:
[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–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/v9.2.0/Controlling-Subprocesses.html