Spec-Zone.ru › Octave 9

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, dos.

: unix ("command")
: status = unix ("command")
: [status, text] = unix ("command")
: […] = unix ("command", "-echo")

Выполнить системную команду, если программа запущена в Unix-подобной операционной системе; в противном случае ничего не делать.

Octave ожидает завершения внешней команды, прежде чем вернуть код завершения программы в status и её вывод в text.

Если функция вызвана без выходного аргумента или указан аргумент "-echo", значение text также отправляется в стандартный поток вывода.

См. также: dos, system, isunix, ismac, ispc.

: dos ("command")
: status = dos ("command")
: [status, text] = dos ("command")
: […] = dos ("command", "-echo")

Выполнить системную команду, если программа запущена в Windows-подобной операционной системе; в противном случае ничего не делать.

Octave ожидает завершения внешней команды, прежде чем вернуть код завершения программы в status и её вывод в text.

Если функция вызвана без выходного аргумента или указан аргумент "-echo", значение text также отправляется в стандартный поток вывода.

См. также: unix, system, isunix, ismac, ispc.

: open file
: output = open (file)

Открыть файл file в Octave или во внешнем приложении в зависимости от типа файла, определяемого по расширению имени файла.

По умолчанию распознаются следующие типы файлов:

.m

Открыть файл в редакторе. Значение output не возвращается.

.mat
octave-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.

См. также: system, python.

: 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.

См. также: system, perl.

: 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.

См. также: fclose, popen.

: [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.

См. также: popen, waitpid.

: 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 содержит зависящее от системы сообщение об ошибке.

См. также: fopen, fclose, fcntl.

: [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.

См. также: waitpid, WNOHANG, WUNTRACED.

: 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, чтобы указать, что она должна немедленно вернуть состояние вместо ожидания завершения процесса.

См. также: waitpid, WUNTRACED, WCONTINUE.

: 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

См. также: waitpid, WNOHANG, WCONTINUE.

: 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 содержит зависящее от системы сообщение об ошибке.

См. также: fopen, dup2.

: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API