文章
· 十一月 4 阅读大约需 3 分钟

第十一章 本地进程间通信(管道) - 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() 获得。

讨论 (0)1
登录或注册以继续