36.5 控制子进程

Octave 包含一些高级命令,如 systempopen,用于启动子进程。如果您想运行另一个程序来执行某些任务,然后查看其输出,您可能需要使用这些函数。

Octave 还提供了一些非常底层的类 Unix 函数,这些函数也可用于启动子进程,但您应该只在找不到更高级函数来完成所需操作时才使用它们。

 
system ("string")
system ("string", return_output)
system ("string", return_output, type)
[status, output] = system (…)

执行由 string 指定的 shell 命令。

如果使用一个或多个输出参数调用 system,或者可选参数 return_output 为 true 且子进程是同步启动的,则命令的输出将作为变量返回。否则,如果子进程是同步执行的,其输出将被发送到标准输出。要将通过 system 执行的命令的输出发送到分页器,可以使用如下命令:

[~, text] = system ("cmd");
more on;
disp (text);

more on;
printf ("%s\n", nthargout (2, "system", "cmd"));

如果可选参数 type"async",则进程在后台启动,并立即返回子进程的进程 ID。否则,子进程将被启动,Octave 会等待其退出。如果省略 type 参数,则默认为 "sync"

system 函数可以返回两个值。第一个是命令的退出状态,第二个是写入标准输出流的任何命令输出。例如,

[status, output] = system ("echo foo & exit 2");

会将变量 output 设置为字符串 ‘foo’,并将变量 status 设置为整数 ‘2’。

对于异步运行的命令,status 是为运行命令而启动的命令 shell 的进程 ID。

用于执行命令的 shell 因操作系统而异,UNIX 系统通常使用 /bin/sh,Windows 系统通常使用 cmd.exe

另请参阅: unixdos

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

如果在类 Unix 操作系统下运行,则执行系统命令,否则不执行任何操作。

Octave 会等待外部命令完成,然后将程序的退出状态返回在 status 中,并将任何输出返回在 text 中。

当没有输出参数调用时,或者给出了 "-echo" 参数时,text 也会被发送到标准输出。

另请参阅: dossystemisunixismacispc

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

如果在类 Windows 操作系统下运行,则执行系统命令,否则不执行任何操作。

Octave 会等待外部命令完成,然后将程序的退出状态返回在 status 中,并将任何输出返回在 text 中。

当没有输出参数调用时,或者给出了 "-echo" 参数时,text 也会被发送到标准输出。

另请参阅: unixsystemisunixismacispc

 
open file
output = open (file)

根据文件扩展名确定的文件类型,在 Octave 中或在外部应用程序中打开文件 file

默认情况下,可识别的文件类型有:

.m

在编辑器中打开文件。不返回 output 值。

.mat
octave-workspace

使用 load 打开数据文件。如果没有请求返回值 output,则变量将被加载到基本工作空间中。否则,output 将是一个包含已加载数据的结构体。请参阅 load 函数

.ofig

使用 hgload 打开图形。请参阅 hgload 函数

.fig, .ofig

加载图形。

.exe

执行程序(仅在 Windows 系统上)。不返回 output 值。

如果在加载路径中找到函数 openxxx(其中 xxx 是扩展名),也可以处理自定义文件扩展名。该函数必须接受文件名作为输入。例如,为了像默认处理 ".mat" 文件那样将 ".dat" 数据文件加载到基本工作空间中,可以定义 "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 加载路径中搜索。

另请参阅: systempython

 
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

另请参阅: systemperl

 
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)

关闭由 popen 打开的文件标识符 fid

如果成功,fclose 返回 0,否则返回 -1。

编程说明:函数 fclose 也可用于相同目的。

另请参阅: fclosepopen

 
[in, out, pid] = popen2 (command, args)

启动一个具有双向通信能力的子进程。

进程名称由 command 给出,args 是一个包含命令选项的字符串数组或元胞数组。

子进程的输入流和输出流的文件标识符分别在 inout 中返回。如果命令执行成功,pid 包含子进程的进程 ID。否则,pid 为 −1。

例如:

[in, out, pid] = popen2 ("sort", "-r");
fputs (in, "these\
are\
some\
strings\
");
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

请注意,popen2popen 不同,它不会“回收”子进程。如果您不使用 waitpid 检查子进程的退出状态,它将一直驻留直到 Octave 退出。

另请参阅: popenwaitpid

 
val = EXEC_PATH ()
old_val = EXEC_PATH (new_val)
old_val = EXEC_PATH (new_val, "local")

查询或设置内部变量,该变量指定一个冒号分隔的目录列表,在执行外部程序时将其附加到 shell 的 PATH 中。

初始值取自环境变量 OCTAVE_EXEC_PATH,但该值可以通过命令行参数 --exec-path PATH 覆盖。

当从函数内部使用 "local" 选项调用时,该变量会在该函数及其调用的任何子例程中局部更改。退出函数时恢复原始变量值。

另请参阅: IMAGE_PATHOCTAVE_HOMEOCTAVE_EXEC_HOME

在大多数情况下,以下函数只是解码其参数并进行相应的 Unix 系统调用。关于如何使用它们的完整示例,请查看函数 popen2 的定义。

 
[pid, msg] = fork ()

创建当前进程的一个副本。

Fork 可以返回以下值之一:

> 0

您在父进程中。从 fork 返回的值是子进程的进程 ID。您应该安排使用 waitpid 等待任何子进程退出。

0

您在子进程中。您可以调用 exec 来启动另一个进程。如果失败,您应该调用 _Exit 来终止子进程。

< 0

调用 fork 由于某种原因失败。您必须采取应对措施。系统相关的错误消息将保存在 msg 中。

另请参阅: exec_Exit

 
_Exit ()
_Exit (status)

以退出代码 status 退出当前运行的进程。

如果无参数调用,则以状态 0 退出,表示成功。

可选的整数参数 status 指定退出码。

编程说明:此函数映射到 C++ 函数 quick_exit。调用进程将停止,所有打开的文件描述符将被关闭。这是结束从 Octave 启动的子进程的正确函数。普通的 C 库函数 'exit' 不起作用。

另请参阅: fork

 
[err, msg] = exec (file, args)

用新进程替换当前进程。

在不先调用 fork 的情况下调用 exec 将终止当前的 Octave 进程,并用 file 指定的程序替换它。例如,

exec ("ls", "-l")

将运行 ls 并返回到您的 shell 提示符。

如果成功,exec 不会返回。如果 exec 返回了,err 将为非零值,且 msg 将包含一个系统相关的错误消息。

 
[read_fd, write_fd, err, msg] = pipe ()

创建一个管道,并将管道的读取端和写入端分别返回给 read_fdwrite_fd

如果成功,err 为 0 且 msg 为空字符串。否则,err 为非零值且 msg 包含一个系统相关的错误消息。

另请参阅: mkfifo

 
[fid, msg] = dup2 (old, new)

复制一个文件描述符。

如果成功,fid 大于零且包含新的文件 ID。否则,fid 为负值且 msg 包含一个系统相关的错误消息。

另请参阅: fopenfclosefcntl

 
[pid, status, msg] = waitpid (pid, options)

等待进程 pid 终止。

pid 参数可以是:

−1

等待任意子进程。

0

等待任何进程组 ID 等于 Octave 解释器进程的进程组 ID 的子进程。

> 0

等待 ID 为 pid 的子进程终止。

options 参数可以是以下一个或多个常量的按位 OR:

0

等待直到收到信号或子进程退出(如果省略 options 参数,这是默认行为)。

WNOHANG

如果状态不能立即获取,则不挂起等待。

WUNTRACED

报告任何已停止且自停止以来尚未报告状态的子进程的状态。

WCONTINUE

如果已停止的子进程通过传递 SIGCONT 信号而恢复执行,则返回。此值可能并非在所有系统上都有意义。

如果返回的 pid 值大于 0,则表示已退出的子进程的进程 ID。如果发生错误,pid 将小于零且 msg 将包含一个系统相关的错误消息。status 的值包含关于已退出子进程的额外的系统相关信息。

另请参阅: WCONTINUEWCOREDUMPWEXITSTATUSWIFCONTINUEDWIFSIGNALEDWIFSTOPPEDWNOHANGWSTOPSIGWTERMSIGWUNTRACED

 
v = WCONTINUE ()

返回 WCONTINUE 宏的数值。

WCONTINUE 是可以传递给 waitpid 的选项参数,用于指示如果已停止的子进程已通过传递 SIGCONT 信号恢复执行,也应返回。

另请参阅: waitpidWNOHANGWUNTRACED

 
tf = WCOREDUMP (status)

给定来自 waitpid 调用的 status,如果子进程生成了核心转储,则返回 true。

此函数应仅在 WIFSIGNALED 返回 true 时使用。用于实现此函数的宏在 POSIX.1-2001 中未指定,并且在某些 Unix 实现(如 AIX、SunOS)上不可用。

另请参阅: waitpidWIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGWIFSTOPPEDWSTOPSIGWIFCONTINUED

 
tf = WEXITSTATUS (status)

给定来自 waitpid 调用的 status,返回子进程的退出状态。

此函数应仅在 WIFEXITED 返回 true 时使用。

另请参阅: waitpidWIFEXITEDWIFSIGNALEDWTERMSIGWCOREDUMPWIFSTOPPEDWSTOPSIGWIFCONTINUED

 
tf = WIFCONTINUED (status)

给定来自 waitpid 调用的 status,如果子进程已由 SIGCONT 信号继续执行,则返回 true。

另请参阅: waitpidWIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGWCOREDUMPWIFSTOPPEDWSTOPSIGWCONTINUE

 
tf = WIFEXITED (status)

给定来自 waitpid 调用的 status,如果子进程正常终止,则返回 true。

另请参阅: waitpidWEXITSTATUSWIFSIGNALEDWTERMSIGWCOREDUMPWIFSTOPPEDWSTOPSIGWIFCONTINUED

 
tf = WIFSIGNALED (status)

给定来自 waitpid 调用的 status,如果子进程因未捕获的信号而终止,则返回 true。

另请参阅: waitpidWIFEXITEDWEXITSTATUSWTERMSIGWCOREDUMPWIFSTOPPEDWSTOPSIGWIFCONTINUED

 
tf = WIFSTOPPED (status)

给定来自 waitpid 调用的 status,如果子进程已停止,则返回 true。

另请参阅: waitpidWIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGWCOREDUMPWSTOPSIGWIFCONTINUED

 
v = WNOHANG ()

返回 WNOHANG 宏的数值。

WNOHANG 是可以传递给 waitpid 的选项参数,用于指示如果状态不能立即获取,则不挂起等待。

另请参阅: waitpidWUNTRACEDWCONTINUE

 
tf = WSTOPSIG (status)

给定来自 waitpid 调用的 status,返回导致子进程停止的信号的编号。

此函数应仅在 WIFSTOPPED 返回 true 时使用。

另请参阅: waitpidWIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGWCOREDUMPWIFSTOPPEDWIFCONTINUED

 
tf = WTERMSIG (status)

给定来自 waitpid 调用的 status,返回导致子进程终止的信号的编号。

此函数应仅在 WIFSIGNALED 返回 true 时使用。

另请参阅: waitpidWIFEXITEDWEXITSTATUSWIFSIGNALEDWCOREDUMPWIFSTOPPEDWSTOPSIGWIFCONTINUED

 
v = WUNTRACED ()

返回 WUNTRACED 宏的数值。

WUNTRACED 是可以传递给 waitpid 的选项参数,用于指示如果子进程已停止但未通过 ptrace 系统调用进行跟踪,也应返回。

另请参阅: waitpidWNOHANGWCONTINUE

 
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

异步 I/O。

F_SETFL

fid 的文件状态标志设置为 arg 指定的值。唯一可以更改的标志是 O_APPENDO_NONBLOCK

如果成功,status 为 0 且 msg 为空字符串。否则,status 为 -1 且 msg 包含一个系统相关的错误消息。

另请参阅: fopendup2

 
kill (pid, sig)
[status, msg] = kill (pid, sig)

向进程 pid 发送信号 sig

如果 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 信号名称及其定义值的结构体。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4

版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4