Clozure CL中文版013:将其他程序作为子进程运行
Category:帮助手册将其他程序作为子进程运行
概观
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 t) pty sharing input if-input-does-not-exist output (if-output-exists:error) (error :output) (if-error-exists :error) status-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。
http://mip.i3geek.com