36.5 Управление дочерними процессами
Octave включает некоторые высокоуровневые команды, такие как system и popen, для запуска дочерних процессов. Если вы хотите запустить другую программу для выполнения некоторой задачи и затем посмотреть на её вывод, вы, вероятно, захотите использовать эти функции.
Octave также предоставляет несколько функций низкого уровня, похожих на Unix-функции, которые также могут быть использованы для запуска дочерних процессов, но вы, вероятно, должны использовать их только в том случае, если не можете найти способ выполнить необходимое с помощью высокоуровневых функций.
- system ("строка")
- system ("строка", return_output)
- system ("строка", return_output, type)
- [статус, вывод] = system (…)
-
Выполнить командную строку, заданную строкой.
Если необязательный аргумент type равен
"async", процесс запускается в фоновом режиме, и идентификатор процесса дочернего процесса возвращается немедленно. В противном случае дочерний процесс запускается, и Octave ожидает его завершения. Если аргумент type опущен, он по умолчанию имеет значение"sync".Если system вызывается с одним или несколькими аргументами вывода, или если необязательный аргумент return_output имеет значение true, и дочерний процесс запускается синхронно, то вывод команды возвращается в виде переменной. В противном случае, если дочерний процесс выполняется синхронно, его вывод отправляется в стандартный вывод. Чтобы направить вывод команды, выполненной с помощью
systemчерез визуализатор, используйте команду, подобную[~, text] = system ("cmd"); more on; disp (text);или
more on; printf ("%s\n", nthargout (2, "system", "cmd"));Функция
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 (файл)
-
Открыть файл файл в 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.
- fid = popen (команда, режим)
-
Запустить процесс и создать канал.
Имя команды для запуска задано команда. Аргумент режим может быть
"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также может быть использована для этой цели.
- [вход, выход, pid] = popen2 (команда, аргументы)
-
Запустить дочерний процесс с двусторонней связью.
Имя процесса задано команда, а аргументы — это массив или ячейный массив строк, содержащий параметры для команды.
Идентификаторы файлов для потоков ввода и вывода дочернего процесса возвращаются в вход и выход. Если выполнение команды прошло успешно, 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— это аргумент options, который может быть передан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— это аргумент options, который может быть передан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— это аргумент options, который может быть передан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/v5.2.0/Controlling-Subprocesses.html