第十一章 本地进程间通信(管道) - OPEN 命令管道示例
第十一章 本地进程间通信(管道) - OPEN 命令管道示例
OPEN 命令管道示例
以下是有效的命令管道OPEN语句。每个示例指定 10 秒的超时:
OPEN "|CPIPE|1":"/nethome/myprog":10 // using shell, no args
OPEN "|CPIPE|1":("/nethome/myprog":/WRITE):10 // using shell, no args, WRITE
OPEN "|CPIPE|2":/COMMAND="/nethome/myprog":10 // no shell, no args
OPEN "|CPIPE|3":("":/COMMAND="/nethome/myprog"):10 // no shell, no args
OPEN "|CPIPE|4":(/COMMAND="/nethome/myprog":/ARGS=arg1):10 // no shell, 1 arg
OPEN "|CPIPE|5":("/nethome/myprog":/ARGS=arg1):10 // no shell, 1 arg
OPEN "|CPIPE|6":("/nethome/myprog":/ARGS=arg1:/WRITE):10 // no shell, 1 arg, WRITE
OPEN "|CPIPE|7":(/COMMAND="/nethome/myprog":/ARGS=arg1,arg2):10 // no shell, 2 args
OPEN "|CPIPE|8":(/COMMAND="/nethome/myprog":/ARGS=args...:/WRITE):10 // no shell, args array, WRITE
在 Windows 系统上,参数可以包含空格或双引号 (") 字符。在这些情况下,可以将参数加引号,并且可以通过加倍来转义文字双引号字符:
OPEN "|CPIPE|9":("/nethome/myprog":/ARGS="string with blanks"):10
OPEN "|CPIPE|10":("/nethome/myprog":/ARGS="string with literal "" character"):10
OPEN Errors
如果对非 IPC 设备发出带有QW参数的OPEN命令,当您尝试写入此设备时发生错误。
以下 UNIX® 示例打开一个到 lp 程序的输出管道,在本例中该程序的路径名为/usr/bin/lp 。然后它通过此管道将全局^TEXT的输出发送到打印机。
print ; Send the first layer of global ^TEXT to the printer.
SET IO="/usr/bin/lp"
OPEN IO:"QW" ; Open the pipe to lp
USE IO WRITE "The first layer of ^TEXT",! ; Print the title
; . . .
; Print each line, using $ORDER on the global ^TEXT
USE IO WRITE !,"The End.",#
CLOSE IO ; close the pipe, spooling the file to lpsched
QUIT
可以更改此示例,以便OPEN命令将参数传递给 lp 程序。例如,要指定lp应将输出发送到名为 Laserjet 的打印机设备,可以将SET命令替换为以下内容:
SET IO="/usr/bin/lp -dlaserjet"
以下示例展示了如何从外部程序读取数据。此处,该进程打开一个到 UNIX® 程序 who 的输入管道,以便它可以读取当前登录到 UNIX® 的所有用户的 ID。
getids ; read the login IDs of everybody currently on
SET IO="/usr/bin/who"
SET $ZTRAP="EOT"
KILL LOGINS
OPEN IO:"Q"
; note that "R" (the default) is understood
SET users=0
FOR I=0:0 {
USE IO
READ USER
SET users=users+1
SET LOGINS(USER)=""
}
QUIT
EOT SET $ZTRAP=""
USE 0
WRITE !,USERS," is/are currently logged on.",!
CLOSE IO
QUIT
在 Windows 系统上,当 CPIPE OPEN程序参数指定 /COMMAND 或 /ARGS 时,系统使用 CreateProcess() 来运行该命令。如果 CreateProcess() 失败,则 OPEN将失败并显示错误。 GetLastError() 值可通过$SYSTEM.Process.OSError()获得。
在 UNIX® 系统上,当 CPIPE OPEN程序参数指定 /COMMAND 或 /ARGS 时,系统会创建一个新进程,该进程发出 exec() 来运行该命令。如果 exec() 失败, OPEN将失败并显示错误。 exec() errno 可通过$SYSTEM.Process.OSError() 获得。