36.5控制子流程

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

Octave还提供了一些非常低级的类Unix函数,这些函数也可以用于启动子流程,但您可能只有在找不到任何方法来执行更高级的函数时才应该使用它们。

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

执行从指定的shell命令string.

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

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

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

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

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

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

将设置变量output到字符串foo,以及变量status到整数2’.

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

用于执行命令的shell随操作系统的不同而不同,并且通常/bin/sh对于UNIX系统和cmd.exe对于Windows系统。

详见: unix, dos.

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

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

Octave等待外部命令完成,然后返回中程序的exitstatusstatus以及中的任何输出text.

当在没有输出参数的情况下调用时,或者"-echo"给出了参数,那么text也被发送到标准输出。

详见: dos, system, isunix, ismac, ispc.

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

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

Octave等待外部命令完成,然后返回中程序的exitstatusstatus以及中的任何输出text.

当在没有输出参数的情况下调用时,或者"-echo"给出了参数,那么text也被发送到标准输出。

详见: unix, system, isunix, ismac, ispc.

广告
 
: open file
: output = open (file)

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

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

.m

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

广告
.mat
octave-workspace

使用打开数据文件load.如果没有返回值output被指定时,变量被加载到基本起作用空间中。否则output将是包含已加载数据的结构体。详见加载函数.

广告
.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)

通过双向通信启动子流程。

进程的名称从给定commandargs是包含命令参数的字符串数组或元胞数组。

子流程的输入流和输出流的文件标识符在中返回inout如果命令的执行成功,pid包含子流程的流程ID。否则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退出。

详见: popen, waitpid.

广告
 
: 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_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME.

广告

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

 
: [pid, msg] = fork ()

创建当前流程的副本。

Fork可以返回以下值之一:

> 0

您处于父进程中。返回的值来自fork是子进程的进程id。您可能应该安排等待任何子进程退出。

广告
0

您正处于子进程中。你可以调用exec以启动另一个进程。如果失败,你可能应该调用exit.

广告
< 0

的呼叫fork因为某种原因失败了。你必须采取疏散行动。系统相关的错误消息将在中等待msg.

广告
广告
 
: [err, msg] = exec (file, args)

用新流程替换当前流程。

调用exec不需要先调用fork将终止当前的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包含系统相关错误消息。

详见: fopen, fclose, fcntl.

广告
 
: [pid, status, msg] = waitpid (pid, options)

等待进程pid终止。

这里的pid参数可以是:

−1

等待任何子进程。

广告
0

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

广告
> 0

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

广告

这里的options自变量可以是零个或多个以下常量的位“或”:

0

等待,直到接get信号或子进程退出(如果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信号

详见: 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,如果子进程是通过传递恢复的,则返回trueSIGCONT.

详见: 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

异步I/O。

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

广告

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

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