TA的每日心情 | 开心 2025-11-21 15:35 |
|---|
签到天数: 125 天 [LV.7]常住居民III
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 wqh810914 于 2025-3-11 07:28 编辑
. q7 X5 l. ~3 I7 [' g C
~) d7 D1 o( m+ Lipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
" i( C9 o' n Z2 R# nipc的功能极大的方便了用户做开发。! w) ]& w4 u2 U4 R# V# Z$ m
父进程通过ipc和子进程通信) h P+ q+ p: u9 k+ X* p3 d; {( c' E
如何通信* i& j7 i! g7 G+ U
父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。: k9 X; c; w" D2 N# j$ W
e.g. 一个简单的perl程序
& z3 y0 p7 z+ y* a: v#! /usr/bin/perl -w1 x& b. j4 Q, [: h: ]
print $ARGV[0];: c' A. H) P* s7 G3 D
getinfo;, ~; p. x' o* U \3 |: ]5 F
sub getinfo {) J" p: r+ {# R( O- C
return $ARGV[1];+ l# \" v4 q) Z0 h: W& v* V
}如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输
0 x) \+ w7 g& x- N出的值。; |: N7 Q8 `6 y) r
同步,异步读取子进程返回信息
6 K3 c* Q r: |9 A' [1 C) a+ I同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏' e: j. j. e- t0 N3 @% B) y' h
蔽别的程序运行。8 h; P6 y: A! T4 f% B
数据缓存+ b6 C& z3 }: I9 w- b
一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程& y8 `7 ?% [9 r5 Y+ T$ e8 x: g
可以顺利读到这些输出。) g" E) P* x. ^2 ?
子进程的属性( M9 r* w0 J1 W! Y& q w2 n$ j' ?! z
子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。$ _ y, u2 `7 G3 ~, I1 U2 @
command Name of the command5 A& |/ S9 {3 Q; A, o3 e# H. b
host Name of the host machine running the process
/ A8 [( Y, v; p$ W% h( }processPid Process id of the child process on host
# c% E, w2 g4 |! f, Q8 TexitStatus Exit status of the child process
7 a, f, w& `% b$ ]priority Priority given to the child process
. a3 q/ h% J' ^$ F2 g7 Dtype Begin, Skill, or Batch process
9 D9 c; g# b) ], t& q" cstate Active, Dead, or Stopped
N6 z# g. v! Q9 }几个主要的ipc函数
9 i+ r; [1 c6 g" `9 vipcBeginProcess
! u; H8 S0 w: s4 w该函数用来调用别的程序并返回子进程, 函数定义如下:: ^- v- n8 l+ b' g, Z0 n
ipcBeginProcess(
) S1 u& T5 K# H# d4 s8 A1 G0 v3 H% Dt_command
2 n. h8 G; @. \) P0 t. O# R[ t_hostName ]' U" U4 b4 ]# [3 i
[ tsu_dataHandler ]" W4 `$ ^ @; `7 _; R
[ tsu_errHandler ]
2 D7 O9 W( a* _[ tsu_postFunc ]
+ C! [$ `; o* D/ f# L: B) k[ t_logFile ]' o1 K' A' o& G% Z3 z; ?5 K
)
% `+ Z5 \; J& R' X=> o_childId参数解释,$ N: X: v6 ~- ]
t_command=> 要执行的程序/命令,比如linux里面的命令date;( |8 H& ?: ^4 `/ I0 p) a" s
t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;/ v+ L' l( H/ C- g6 n
tsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就6 o; f8 k' F* f b
是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显- ~. h5 v7 M6 [
式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
6 S/ p& ]3 C4 g, L+ Jt_logfile=>用来记录所有的子程序的输出信息。# p& X. X, ?5 Z( C2 \6 {
示例:* k& u) }7 s) j7 O
同步读取
) Q$ \+ x- |: M/ p5 j. ?cid = ipcBeginProcess("date") => ipc:0 ;子进程0
8 b5 e7 N4 B8 ?' j1 q" F) SipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值
# w Y4 Y% f5 L ?% e- D7 n异步读取
' u8 c+ s3 d+ A8 D" `' y0 Y! z- chandler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函
8 p, O7 H" i1 x: p, V数' s0 y$ Y! ^1 n8 e
cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值8 ~- x- U+ Z$ y' J8 \
Date: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess) X$ c2 ]7 Q8 e' q' i
这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专
2 M+ K$ G7 `/ T$ v门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。3 A. e. z3 W# E8 W
[ tsu_errHandler ]
1 }( D8 H/ q4 Z. X+ P9 P[ tsu_postFunc ]
7 R. o7 X# m" J; J[ t_logFile ]
3 d# l& m4 I( x[ x_cmdDesc ]# H: G3 [& h# w) m$ B5 h; m
[ x_rESDesc ]
) ^. h2 B# s. @5 n)
, _% K& ? L# ` j=> o_childId参数解释:
8 Q8 h) B, F" A! x5 T- r* y+ t. Tx_cmdDesc=> skill命令输出通道,默认为3
! c2 ^: ~1 J5 @) sx_rESDesc=> skill运行结果接受通道,默认为4
* }4 c5 x6 d9 b. B5 C+ U% `示例请参考ipc文档P44.
- S4 o& B- q! [6 [6 d+ ^, x* AipcWaitForProcess
( u# V1 }$ ~, U7 \) Z父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用
+ U7 n$ F* b2 Y: qipcWaitForProcess就可以挂起父进程直到子进程运行起来。# N" e+ x$ r8 r, x$ d
函数定义:' W$ m) ?& E$ n* B/ e% |% D, Z
ipcWaitForProcess(
/ R" `8 o9 h# H* O) Do_childId8 j% x+ J- V3 Q A* Q4 G( C+ c) T
[ x_timeOut ]
, f" j8 j# k& n1 L$ P7 a+ W)1 `* c2 c+ b ~$ r
=> t参数说明:/ F# B$ h) y; s3 J
o_childId=> 子进程的ID6 B& C9 G6 ]7 K# a
x_timeOut=>等待的时间5 U3 J1 s; T* t) a
ipcReadProcess/ipcWriteProcess; ~: s, K! _( @* M2 P
这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
- U+ J& \9 g9 Q' y" V" GipcIsActiveProcess/ipcIsAliveProcess
. c8 L* H- j5 |6 a# u检查一个子进程是不是还有效,类似于查看子进程的state属性& S7 m. o' b) f+ n
cdsServIpc.exe
. V, f: G& z9 K1 K. n要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有% v6 q- }* @1 e# E3 w: y2 ]1 ?
cdsServIpc.exe文件 |
|