Clozure CL中文版013:将其他程序作为子进程运行

  • 0

Clozure CL中文版013:将其他程序作为子进程运行

Category:帮助手册 Tags : 

将其他程序作为子进程运行

概观

Clozure CL提供了运行外部Unix程序的原语,选择Lisp流并将它们连接到它们的输入和输出源,(可选)等待它们的完成并检查它们的执行和退出状态。

下面描述的所有全局符号都是从CCL包导出的。

此实现以CMUCL中的类似工具为模型,并使用了一些代码。

例子

;;;;在lisp字符串流中捕获“uname”程序的输出
;;;;并返回生成的字符串(将包含尾随换行符。)?
(with-output-to-string (stream)
(run-program “uname” ‘(“-r”) :output stream))
;;;写一个字符串到* STANDARD-OUTPUT *,这很难。
(run-program “cat” () :input (make-string-input-stream “hello”) :output t)
;;; 发现“ls”不会扩展通配符。
(run-program “ls” ‘(“*.lisp”) :output t)
;;; 让shell扩展通配符。
(run-program “sh” ‘(“-c” “ls *.lisp”) :output t)

如果Clozure CL的当前目录包含.lisp文件,这些最后的示例将仅生成输出。

限制和已知错误

  • 当输入,输出或错误被指定为T并且wait被指定为NIL时,Clozure CL和外部进程可能会混淆谁拥有哪些流。
  • 需要与终端设备通信的外部进程可能无法正常工作; 运行Clozure CL的环境(SLIME,ILISP)会影响这一点。

外部程序字典

run-program program args &key (wait tpty sharing input if-input-does-not-exist output (if-output-exists:error) (error :output) (if-error-exists :errorstatus-hook external-format env (silently-ignore-catastrophic-failures *silently-ignore-catastrophic-failure-in-run-program*)             [功能]

调用外部程序作为lisp的OS子进程。

程序

表示可执行文件的字符串或路径名。PATH环境变量用于查找名称不包含目录组件的程序。

ARGS

简单字符串列表

等待

指示运行程序是否应等待EXTERNAL-PROCESS完成或应立即返回。

PTY

此选项已被接受但当前被忽略; 它旨在使运行需要与终端设备交互的外部程序变得更加容易。

分享

当INPUT,OUTPUT或ERROR被请求为:STREAM时,为在RUN-PROGRAM内创建的任何流设置特定的共享模式(请参阅OPEN和MAKE-SOCKET的附加关键字)。

输入

选择EXTERNAL-PROCESS使用的输入源。可以是以下任何一种:

  • NIL指定应使用空输入流(例如,/ dev / null)。
  • T指定EXTERNAL-PROCESS应使用调用Clozure CL的输入源。
  • 字符串或路径名。指定EXTERNAL-PROCESS应从命名的现有文件接收其输入。
  • :STREAM创建为字符输出打开的Lisp流。写入此流的任何数据(可作为EXTERNAL-PROCESS对象的EXTERNAL-PROCESS-INPUT-STREAM访问)都显示为外部进程的输入。
  • 一条小溪。指定lisp流应该为EXTERNAL-PROCESS提供输入。

如果输入不存在

如果input参数指定现有文件的名称,则在打开该文件时,此参数将用作OPEN的if-does-not-exists参数。

产量

指定应发送外部进程的标准输出的位置。类似于上面的输入。

如果输出存在

如果将output指定为字符串或路径名,则在打开该文件时,此参数将用作OPEN的if-exists参数。

错误

指定应从何处发送外部进程的错误输出。除了允许输出的值之外,还可以使用关键字:OUTPUT来指示应在标准输出所在的位置发送错误输出。

如果错误,存在

类似于if-output-exists。

状态挂机

用户定义的一个参数的函数(EXTERNAL-PROCESS结构。)只要Clozure CL检测到EXTERNAL-PROCESS状态发生变化,就会调用此函数。

外部格式

用于与外部进程通信的所有流(输入,输出和错误) 的外部格式(请参阅外部格式)。

ENV

外部进程的新OS环境变量绑定。默认情况下,外部进程继承正在运行的Lisp进程的环境。Env是一个包含元素的关联列表(<Environment Variable Name>。<Value>)。名称和值是区分大小写的字符串。见setenv

默默忽略灾难性的,失败

如果NIL,如果run-program无法启动程序,则发出错误信号。如果是非NIL,则通过设置状态和退出代码字段来处理故障与程序本身的故障相同。默认是 ccl::*silently-ignore-catastrophic-failure-in-run-program*。

在外部(Unix)进程中运行指定的程序,如果成功则返回EXTERNAL-PROCESS类型的对象。

该实现涉及一个lisp进程/线程,它监视此外部进程的状态,并安排外部进程的标准I / O描述符连接到指定的lisp流。因为这可能需要监控线程上做口齿不清流I / O在某些情况下,流提供为一体的价值观:INPUT,:OUTPUT和:ERROR参数不应该是私有的一些其他口齿不清线程。

signal-external-process proc sig &key (错误如果退出 t)[功能]

将信号编号sig发送到外部进程proc(可能已经返回run-program。通常,只有在创建proc的情况下调用此函数才有 用:wait nil。)

如果成功,该函数返回t; 否则,发出错误信号。

但是,如果错误如果激是nil,和信号的外部进程的尝试失败,因为外部进程已经退出,该函数将返回nil,而不是发出错误信号。

external-process-id proc[功能]

返回分配给外部进程对象proc的操作系统进程ID。

external-process-input-stream proc[功能]

返回用于将输入写入外部进程对象proc的lisp流(如果有)。这将是指定:input参数to 时创建的流。run-program:stream

external-process-output-stream proc[功能]

返回lisp流,用于从外部进程对象proc读取输出(如果有)。这是将:output参数to run-program指定为时创建的流:stream。

external-process-error-stream proc[功能]

返回用于从给定OS子进程读取错误输出的流(如果有)。这是将:error参数to run-program指定为时创建的流:stream。

external-process-status proc[功能]

返回,作为多个值,关键字表示外部进程的状态PROC(之一:running,:stopped,signaled,或exited),并且退出代码或终止信号,如果第一值大于其它:running。


Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

欢迎大家来到本站,请积极评论发言;

加QQ群学习交流。