Octave 包含一些高级命令,如 system 和 popen,用于启动子进程。如果您想运行另一个程序来执行某些任务,然后查看其输出,您可能需要使用这些函数。
Octave 还提供了一些非常底层的类 Unix 函数,这些函数也可用于启动子进程,但您应该只在找不到更高级函数来完成所需操作时才使用它们。
("string") ¶("string", return_output) ¶("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。
("command") ¶status = unix ("command") ¶[status, text] = unix ("command") ¶[…] = unix ("command", "-echo") ¶如果在类 Unix 操作系统下运行,则执行系统命令,否则不执行任何操作。
Octave 会等待外部命令完成,然后将程序的退出状态返回在 status 中,并将任何输出返回在 text 中。
当没有输出参数调用时,或者给出了 "-echo" 参数时,text 也会被发送到标准输出。
("command") ¶status = dos ("command") ¶[status, text] = dos ("command") ¶[…] = dos ("command", "-echo") ¶如果在类 Windows 操作系统下运行,则执行系统命令,否则不执行任何操作。
Octave 会等待外部命令完成,然后将程序的退出状态返回在 status 中,并将任何输出返回在 text 中。
当没有输出参数调用时,或者给出了 "-echo" 参数时,text 也会被发送到标准输出。
file ¶output = open (file) ¶根据文件扩展名确定的文件类型,在 Octave 中或在外部应用程序中打开文件 file。
默认情况下,可识别的文件类型有:
.m在编辑器中打开文件。不返回 output 值。
.matoctave-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 加载路径中搜索。
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) ¶关闭由 popen 打开的文件标识符 fid。
如果成功,fclose 返回 0,否则返回 -1。
编程说明:函数 fclose 也可用于相同目的。
[in, out, pid] = popen2 (command, args) ¶启动一个具有双向通信能力的子进程。
进程名称由 command 给出,args 是一个包含命令选项的字符串数组或元胞数组。
子进程的输入流和输出流的文件标识符分别在 in 和 out 中返回。如果命令执行成功,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
请注意,popen2 与 popen 不同,它不会“回收”子进程。如果您不使用 waitpid 检查子进程的退出状态,它将一直驻留直到 Octave 退出。
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" 选项调用时,该变量会在该函数及其调用的任何子例程中局部更改。退出函数时恢复原始变量值。
在大多数情况下,以下函数只是解码其参数并进行相应的 Unix 系统调用。关于如何使用它们的完整示例,请查看函数 popen2 的定义。
[pid, msg] = fork () ¶创建当前进程的一个副本。
Fork 可以返回以下值之一:
您在父进程中。从 fork 返回的值是子进程的进程 ID。您应该安排使用 waitpid 等待任何子进程退出。
您在子进程中。您可以调用 exec 来启动另一个进程。如果失败,您应该调用 _Exit 来终止子进程。
调用 fork 由于某种原因失败。您必须采取应对措施。系统相关的错误消息将保存在 msg 中。
() ¶(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_fd 和 write_fd。
如果成功,err 为 0 且 msg 为空字符串。否则,err 为非零值且 msg 包含一个系统相关的错误消息。
另请参阅: mkfifo。
[fid, msg] = dup2 (old, new) ¶复制一个文件描述符。
如果成功,fid 大于零且包含新的文件 ID。否则,fid 为负值且 msg 包含一个系统相关的错误消息。
[pid, status, msg] = waitpid (pid, options) ¶等待进程 pid 终止。
pid 参数可以是:
等待任意子进程。
等待任何进程组 ID 等于 Octave 解释器进程的进程组 ID 的子进程。
等待 ID 为 pid 的子进程终止。
options 参数可以是以下一个或多个常量的按位 OR:
0等待直到收到信号或子进程退出(如果省略 options 参数,这是默认行为)。
WNOHANG如果状态不能立即获取,则不挂起等待。
WUNTRACED报告任何已停止且自停止以来尚未报告状态的子进程的状态。
WCONTINUE如果已停止的子进程通过传递 SIGCONT 信号而恢复执行,则返回。此值可能并非在所有系统上都有意义。
如果返回的 pid 值大于 0,则表示已退出的子进程的进程 ID。如果发生错误,pid 将小于零且 msg 将包含一个系统相关的错误消息。status 的值包含关于已退出子进程的额外的系统相关信息。
另请参阅: WCONTINUE,WCOREDUMP,WEXITSTATUS,WIFCONTINUED,WIFSIGNALED,WIFSTOPPED,WNOHANG,WSTOPSIG,WTERMSIG,WUNTRACED。
v = WCONTINUE () ¶返回 WCONTINUE 宏的数值。
WCONTINUE 是可以传递给 waitpid 的选项参数,用于指示如果已停止的子进程已通过传递 SIGCONT 信号恢复执行,也应返回。
tf = WCOREDUMP (status) ¶给定来自 waitpid 调用的 status,如果子进程生成了核心转储,则返回 true。
此函数应仅在 WIFSIGNALED 返回 true 时使用。用于实现此函数的宏在 POSIX.1-2001 中未指定,并且在某些 Unix 实现(如 AIX、SunOS)上不可用。
另请参阅: waitpid,WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WIFSTOPPED,WSTOPSIG,WIFCONTINUED。
tf = WEXITSTATUS (status) ¶给定来自 waitpid 调用的 status,返回子进程的退出状态。
此函数应仅在 WIFEXITED 返回 true 时使用。
另请参阅: waitpid,WIFEXITED,WIFSIGNALED,WTERMSIG,WCOREDUMP,WIFSTOPPED,WSTOPSIG,WIFCONTINUED。
tf = WIFCONTINUED (status) ¶给定来自 waitpid 调用的 status,如果子进程已由 SIGCONT 信号继续执行,则返回 true。
另请参阅: waitpid,WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WCOREDUMP,WIFSTOPPED,WSTOPSIG,WCONTINUE。
tf = WIFEXITED (status) ¶给定来自 waitpid 调用的 status,如果子进程正常终止,则返回 true。
另请参阅: waitpid,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WCOREDUMP,WIFSTOPPED,WSTOPSIG,WIFCONTINUED。
tf = WIFSIGNALED (status) ¶给定来自 waitpid 调用的 status,如果子进程因未捕获的信号而终止,则返回 true。
另请参阅: waitpid,WIFEXITED,WEXITSTATUS,WTERMSIG,WCOREDUMP,WIFSTOPPED,WSTOPSIG,WIFCONTINUED。
tf = WIFSTOPPED (status) ¶给定来自 waitpid 调用的 status,如果子进程已停止,则返回 true。
另请参阅: waitpid,WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WCOREDUMP,WSTOPSIG,WIFCONTINUED。
v = WNOHANG () ¶返回 WNOHANG 宏的数值。
WNOHANG 是可以传递给 waitpid 的选项参数,用于指示如果状态不能立即获取,则不挂起等待。
tf = WSTOPSIG (status) ¶给定来自 waitpid 调用的 status,返回导致子进程停止的信号的编号。
此函数应仅在 WIFSTOPPED 返回 true 时使用。
另请参阅: waitpid,WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WCOREDUMP,WIFSTOPPED,WIFCONTINUED。
tf = WTERMSIG (status) ¶给定来自 waitpid 调用的 status,返回导致子进程终止的信号的编号。
此函数应仅在 WIFSIGNALED 返回 true 时使用。
另请参阅: waitpid,WIFEXITED,WEXITSTATUS,WIFSIGNALED,WCOREDUMP,WIFSTOPPED,WSTOPSIG,WIFCONTINUED。
v = WUNTRACED () ¶返回 WUNTRACED 宏的数值。
WUNTRACED 是可以传递给 waitpid 的选项参数,用于指示如果子进程已停止但未通过 ptrace 系统调用进行跟踪,也应返回。
(fid, request, arg) ¶[status, msg] = fcntl (fid, request, arg) ¶更改打开文件 fid 的属性。
以下值可以作为 request 传递:
F_DUPFD ¶返回一个重复的文件描述符。
F_GETFD ¶返回 fid 的文件描述符标志。
F_SETFD ¶设置 fid 的文件描述符标志。
F_GETFL ¶返回 fid 的文件状态标志。以下代码可能被返回(某些标志在某些系统上可能未定义)。
F_SETFL ¶将 fid 的文件状态标志设置为 arg 指定的值。唯一可以更改的标志是 O_APPEND 和 O_NONBLOCK。
如果成功,status 为 0 且 msg 为空字符串。否则,status 为 -1 且 msg 包含一个系统相关的错误消息。
(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