TA的每日心情 | 开心 2022-4-17 15:15 |
---|
签到天数: 116 天 [LV.6]常住居民II
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 wqh810914 于 2025-3-11 07:28 编辑
( f E& [3 v9 S3 w1 |
1 [4 E) d4 K% K; |" w& x4 _4 ^$ W/ Iipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
) d3 m; P V# Q8 w. wipc的功能极大的方便了用户做开发。
; E% h& K: Q4 x2 s% H5 M2 ?( u父进程通过ipc和子进程通信
?( g+ U8 _; J; E1 X! x7 s如何通信& E6 W7 L9 M& A1 w0 X
父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。
& S. s$ K3 z/ a* X6 f3 ^$ }7 c- @e.g. 一个简单的perl程序
7 B2 C+ |: \. c#! /usr/bin/perl -w0 H5 b: ^3 u! ~0 C8 G9 |( W6 @
print $ARGV[0];
1 l$ t% e/ b: t9 K) P/ j3 Z6 sgetinfo;/ ]( G/ x& p- g$ V
sub getinfo {
& C8 J' t9 w3 {( y: ?6 @return $ARGV[1];) M7 o3 v p$ o- p2 o* G
}如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输
8 [8 g+ a- k6 u出的值。3 t9 c8 D; G, y3 w6 N
同步,异步读取子进程返回信息
& e& t3 v# c8 s! b. p同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏. U, c7 I6 ~) O1 j/ W0 O3 w* d! [
蔽别的程序运行。
! a2 V/ @) ^ z1 V1 _5 Y: k) v+ w. S数据缓存4 O$ p" h5 B- Q8 Z3 y- W8 U" p5 K
一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程% L. a& X/ P( v9 \' n2 |
可以顺利读到这些输出。
- w2 `( z3 p: F- @子进程的属性; B7 i! V7 f. P8 {
子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。, U6 }+ w7 |7 a
command Name of the command1 s/ K6 ?4 g: X% L* j6 Q4 ]
host Name of the host machine running the process
/ P' x# Z. L* k. S' p5 pprocessPid Process id of the child process on host
1 o3 b3 E9 }# c. A1 yexitStatus Exit status of the child process. i( J- w5 W9 ?8 b
priority Priority given to the child process
" c4 h e' Z/ O+ _" _! f% C S5 Ftype Begin, Skill, or Batch process
4 A: C. w: D3 h- a" k# Tstate Active, Dead, or Stopped- r$ w& g& o2 ?% {5 z5 r$ ^. R
几个主要的ipc函数/ _- `% g$ @0 U2 W* L! D/ L
ipcBeginProcess2 } z/ n" f: H9 _$ G' N
该函数用来调用别的程序并返回子进程, 函数定义如下:
# a+ H6 m9 `3 q/ B9 d5 O3 dipcBeginProcess($ Z8 e( J$ _' s# }
t_command
+ T; d3 g3 o8 }4 H# X4 r8 P1 q, H[ t_hostName ]% i% M/ h: o6 S4 m" l
[ tsu_dataHandler ]
6 J3 D$ B/ V, S- n8 B) r[ tsu_errHandler ]
, D* U2 E7 d7 A Y2 A[ tsu_postFunc ]
/ @$ ^5 T& Z6 f; r( l( _; W7 e[ t_logFile ]/ x3 t- n! l* h& F
)
& H7 e' P7 Z- f=> o_childId参数解释,* J' p2 Q+ I* J2 \) l3 O' j
t_command=> 要执行的程序/命令,比如linux里面的命令date;& @) t0 \+ d; y) D7 f! y
t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
. Z' q1 i( A% }* n: a0 ~tsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就7 {9 E$ U5 I/ a+ Q" p4 [
是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显9 A7 \/ D# N: R) u
式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
4 H5 q! ~+ Q- F4 V$ p5 Ut_logfile=>用来记录所有的子程序的输出信息。
6 u3 G% n$ |/ F }* z示例:! Y6 K2 e' a. c. M- V% N, v7 a
同步读取 B& Q$ A; [6 @& g; {( f5 l4 N
cid = ipcBeginProcess("date") => ipc:0 ;子进程01 K+ ^4 e5 p, O q
ipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值
' `" Q" ]1 a) {/ B0 T3 U* X: v异步读取! r0 d/ t F. @9 f' c* Q5 @6 r9 M
handler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函& a/ J( A7 S2 m7 _3 `$ k& s
数
0 u8 p* z9 W8 k1 `cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值
3 F: u- ?! D: x0 m, m. X# BDate: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess
& r- ?0 t" l9 O+ z$ \; k! E这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专! [, E# y6 L* K8 J' L& F
门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。8 s% z4 _+ f4 T8 d7 l, e5 `% p
[ tsu_errHandler ]
9 I9 ]; \4 q9 @[ tsu_postFunc ]
+ a. m3 x; O/ j) t" W[ t_logFile ]+ M; P1 H4 T; f7 E' p" [) `& o6 p
[ x_cmdDesc ]
8 f+ f8 ]* B- b, I0 Q% c[ x_rESDesc ]7 c8 j' _) L, H) s7 W' E. G$ U6 I1 U
)
; A0 ?0 t' b* D. \( u7 A5 u+ W6 X=> o_childId参数解释:. w" ~2 w, y. V5 z
x_cmdDesc=> skill命令输出通道,默认为3$ w$ ]( w+ d. F; d9 ~) ^# g1 w& [
x_rESDesc=> skill运行结果接受通道,默认为42 x' v- |# e7 T. \) k- Y% u% T
示例请参考ipc文档P44.
1 [* ^5 e+ d1 b) u0 f1 M9 fipcWaitForProcess
/ @0 p. o) `$ h# ]! c父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用
1 v8 W; L) j \! B2 k% \9 u. ^ipcWaitForProcess就可以挂起父进程直到子进程运行起来。
) C% c+ s: W! ^! ~函数定义:5 ?; T7 Z8 ~2 K: e5 k% l
ipcWaitForProcess(
3 ~" r# ^( F6 a: V& y3 co_childId1 Q; G! `1 Y8 y' J
[ x_timeOut ]6 W! |9 s1 d* f2 j
)
2 `) j2 J4 P3 |8 @=> t参数说明:! n* H% l+ n3 N2 z! A8 n/ z
o_childId=> 子进程的ID
" v+ c% e, x- Q4 D1 k& yx_timeOut=>等待的时间' i0 b% A, _' t7 Q
ipcReadProcess/ipcWriteProcess
; M- A/ }. J7 U- J0 i$ ~0 I% M这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
: ~1 u& x* w( J0 lipcIsActiveProcess/ipcIsAliveProcess$ A$ f# P- l y8 d
检查一个子进程是不是还有效,类似于查看子进程的state属性
6 y* b( n5 ]7 c- M1 ]cdsServIpc.exe
' I2 E! C& W+ l( p要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有4 |' g& e/ ?0 `6 w
cdsServIpc.exe文件 |
|