TA的每日心情 | 开心 2025-10-27 15:12 |
|---|
签到天数: 121 天 [LV.7]常住居民III
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 wqh810914 于 2025-3-11 07:28 编辑 7 ] w) U" l5 z$ d6 l. J: l
( ]" C2 c8 |3 b/ a& g
ipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。# E$ p$ V- {# @, b/ t* m
ipc的功能极大的方便了用户做开发。3 a. v: ]" F4 |. R- Y/ N4 G
父进程通过ipc和子进程通信
6 \1 N1 G' s# ?如何通信
, f& i) W; k8 f父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。5 Z% _/ J, X3 \
e.g. 一个简单的perl程序. Y" e( n5 J8 o5 L
#! /usr/bin/perl -w4 s' N) J( F. R1 b
print $ARGV[0];. l9 u7 P; l: r* j. ?) A, X# a
getinfo;0 e6 ] l3 K' i L& s
sub getinfo {9 r( H- \, M3 O9 _6 D
return $ARGV[1];( J; J& Q* n' t9 i* i
}如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输
5 ~3 Q2 b6 U) R. v5 R, b出的值。4 z1 U( Z/ Z" c/ u% e- W I
同步,异步读取子进程返回信息
4 Q# o' ]( h9 |同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏/ T# q" z2 w6 v$ K6 U
蔽别的程序运行。
$ x3 ~& G9 z- V5 X# o数据缓存- L2 g- c) e; X
一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程
: }; X" P/ ]; l6 G可以顺利读到这些输出。, r* Z. k8 W% i, O/ l6 k" ~
子进程的属性
* `5 E3 F. M4 a子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。
: O2 U+ Z' R* X! e$ H! W/ _command Name of the command) @$ Q6 `' f6 a" y. v1 l) _! Z
host Name of the host machine running the process
# n- C# l8 I% k; c' FprocessPid Process id of the child process on host
4 p. u2 X/ h9 d# i# g- ~exitStatus Exit status of the child process
$ R5 B$ u- W* s' r& D! Xpriority Priority given to the child process1 g( c% b! S- G% j
type Begin, Skill, or Batch process
) ^9 H6 m; b5 b% V5 ystate Active, Dead, or Stopped
0 N+ L1 p! Y% \: F几个主要的ipc函数, c! Y7 a S, b F' I
ipcBeginProcess
9 o$ u* e! a* @! q# p$ p! K该函数用来调用别的程序并返回子进程, 函数定义如下:$ R* T/ L; }) u% v% ?1 m
ipcBeginProcess(7 t- k0 |/ P2 U, D1 N# n
t_command1 ^8 W2 }6 S9 t) d, D/ [" F
[ t_hostName ]1 `4 k8 C# _ b& ?0 E, ]- S; D( {
[ tsu_dataHandler ]! j4 A% L! H. ^ Z
[ tsu_errHandler ]
- M" Q2 L1 \: Y# w[ tsu_postFunc ]3 G2 G' A+ Y# {& [& h) R
[ t_logFile ]$ [# l- E+ A# y5 a: Q
)9 v( C( Y# C" D4 [& F
=> o_childId参数解释,
# n2 [9 H8 Q7 O- h% C P$ i+ _t_command=> 要执行的程序/命令,比如linux里面的命令date;
! T) {: C" B& s3 k0 ]t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
7 [1 p2 Q% |. W8 ]. M: j9 `6 {tsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就
4 M7 G" V* R4 N2 V, V是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显" @! T2 V4 B) M$ Z5 \1 ]
式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
1 E; e9 p2 f& j* v" kt_logfile=>用来记录所有的子程序的输出信息。4 ~. T. q: S3 j H! H! r( ~7 e* u2 f: O
示例:
8 z; Y- u3 _, P同步读取
' k% i. s* m4 n) [/ _cid = ipcBeginProcess("date") => ipc:0 ;子进程0
) }+ h( k- a0 d6 M, }ipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值
& T, Z9 v- t8 j7 O5 ?3 E' z* f异步读取! T3 l) {8 D* j: P% I
handler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函6 l9 c- ~* H! b
数9 {+ h+ U( p$ ^; A) T) A
cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值
, l. |- J9 u6 U/ v& N9 Q0 M; lDate: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess9 | V& n4 Q- X; p7 V
这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专
; `# w! J6 \: e" x, k6 V门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。
! S- Z8 n3 [( [3 d[ tsu_errHandler ]
, F- X$ p4 X' X5 `2 @7 {6 N[ tsu_postFunc ]0 W4 a: y% i9 U, T Z, s) d+ a
[ t_logFile ]
3 B9 a, A: k7 T' K0 S8 p6 [[ x_cmdDesc ]# `, e, u- h3 E0 T( H% s( l
[ x_rESDesc ]* j0 w' J* t# w% N
)/ Z* Z, }- Z) Q z$ c# a/ G, O
=> o_childId参数解释:
" X9 u8 Y3 {+ X( X7 h# \* tx_cmdDesc=> skill命令输出通道,默认为3
! E" U" n( ]( Q* H$ d! ix_rESDesc=> skill运行结果接受通道,默认为4, W* @+ f* E" T. ~- X
示例请参考ipc文档P44.
/ d! r, p! y# ?1 a& v w* MipcWaitForProcess* _7 M. M( L( f" w# U7 b
父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用+ `' C( j% ~7 y% l
ipcWaitForProcess就可以挂起父进程直到子进程运行起来。
$ P8 c1 x7 B$ c函数定义:
( ^0 P7 T& ^, OipcWaitForProcess(! d) c; o6 [6 U+ f) @' }1 M* J
o_childId
$ W0 O0 a, `" f# _; w& m0 H! y9 [[ x_timeOut ]
3 b' A# ^5 y+ ~8 V( F)
8 T8 G. d2 y1 p$ s {6 @=> t参数说明:
G# N% V) }3 z% No_childId=> 子进程的ID7 ^ O3 `% r3 K& p
x_timeOut=>等待的时间; Y" y* |# W0 `; z1 K. o
ipcReadProcess/ipcWriteProcess1 B6 l( \9 Y: U+ Z& m8 V
这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
0 b% Y- N# W1 S: cipcIsActiveProcess/ipcIsAliveProcess
6 K1 w: ^/ e v2 Y& ? I. ~检查一个子进程是不是还有效,类似于查看子进程的state属性
) u; k" M# R) n! Z$ QcdsServIpc.exe
) K& s9 E z; @' K# u要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有
7 O% Y. _: F7 U' B; m0 S) WcdsServIpc.exe文件 |
|