TA的每日心情 | 开心 2025-11-21 15:35 |
|---|
签到天数: 125 天 [LV.7]常住居民III
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 wqh810914 于 2025-3-11 07:28 编辑
2 V" @( w, b8 C8 E9 _; ?' t* I. G* M6 ?5 G
ipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
/ f3 x. N, R! Iipc的功能极大的方便了用户做开发。5 C7 L* [, A9 p+ R, A4 y
父进程通过ipc和子进程通信
4 n' A* i2 Z4 D如何通信
* D; P- w$ w/ Z( n父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。
. {! V! a% p3 T) pe.g. 一个简单的perl程序
) O( L) i9 P6 N. x5 u#! /usr/bin/perl -w: K% q- `4 R$ l, ^' [
print $ARGV[0];
& |8 c( ?+ z# S0 V3 Pgetinfo;
8 m; W/ r/ w2 J/ y0 s8 ?* Csub getinfo {
+ l: Z! M: D" Q: j. sreturn $ARGV[1];
9 R1 L' G- m0 ]; G% Y0 |}如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输6 c- R9 v3 T* C
出的值。
& }) t Q) i' ]2 @7 Z- r$ j* L同步,异步读取子进程返回信息( @1 r; d# z/ M
同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏9 s3 H& v9 L6 U, m% E! i% v
蔽别的程序运行。7 X; _! G5 }; J: c
数据缓存
9 G: A9 ]" Q e8 C& d! k" R一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程
: n4 [! Q& L. w7 Y% l) O可以顺利读到这些输出。+ p7 E8 N8 k& H" ]3 l4 ]
子进程的属性
) L! {; Y& Q% F" g0 I子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。
) B1 b! e: n8 c. \9 e! f; ncommand Name of the command
) B7 H4 t) C6 O6 \, g6 i: i$ K" Hhost Name of the host machine running the process1 S. ^" c) L! Y& W# ^, e1 [& u/ p
processPid Process id of the child process on host
5 X6 h" {0 R& d5 D9 N" |exitStatus Exit status of the child process' V2 X# ?% h) ], S d
priority Priority given to the child process
0 q$ s& z* q" P* C' L0 D: u+ @type Begin, Skill, or Batch process
# {6 S3 `3 k% X! Z3 z' I( T% {, zstate Active, Dead, or Stopped8 u) W( o9 X3 [) m. }' ]$ ~3 w
几个主要的ipc函数
; }1 ~7 m' n2 ?3 HipcBeginProcess
) o7 h( G$ ^+ w7 w4 t ^4 s9 A该函数用来调用别的程序并返回子进程, 函数定义如下:
}; Z# c2 H; T* _9 n# d' k$ ripcBeginProcess(
+ G* w0 ]- o) vt_command
) `8 \- a' ]$ o" f3 C, Z[ t_hostName ]
p9 `6 m6 M& f+ q[ tsu_dataHandler ]
* d' x! y n* n[ tsu_errHandler ]
8 L* B5 B7 H2 K' Q& o+ h+ {[ tsu_postFunc ]
+ n# u' R! _- ~$ ]/ n' F[ t_logFile ]
3 ~; l) B9 z8 U+ m) h0 ^)
+ ~1 B1 S! ?, A7 [=> o_childId参数解释,
0 c0 p3 } c. q& o- D$ }/ z' Ut_command=> 要执行的程序/命令,比如linux里面的命令date;9 b# y$ t# x% q f; q' Z9 H# o
t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
1 w* Z: g9 M7 Ftsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就
& K! D$ {: @) W# T, T! t是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显$ U/ E# P! ~ ?- u
式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;( j$ J5 q" a7 |1 ]* U4 W
t_logfile=>用来记录所有的子程序的输出信息。# @& |% l) d% B1 U0 }+ k
示例:9 X4 Q' S. F3 t* i2 D3 J0 y
同步读取# Q% F5 d+ v. N" K
cid = ipcBeginProcess("date") => ipc:0 ;子进程0
# d& }6 N- b' p# eipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值; A& @9 {4 w- H' M0 e
异步读取* o6 s1 u5 A* f3 x
handler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函
* k$ o) `/ T/ F% h+ a5 H# m9 q数
- w+ @9 [6 C( H& d# Acid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值3 _- K/ @: {% V7 v
Date: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess
, I! S4 v$ k l; f这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专
% ^2 _! m, Y# ^; B% C6 o$ g门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。
6 j1 \: P* d$ M7 R. s4 b5 B[ tsu_errHandler ]
5 m1 P2 s' N. v2 t. J4 B. \[ tsu_postFunc ]& g. a3 O( [; f9 F1 Z
[ t_logFile ]8 I V9 d! v6 a2 H
[ x_cmdDesc ]
8 A1 i8 P$ @$ d. V# u Y' U, r+ B[ x_rESDesc ]
' Z4 L! ]0 E' n0 ?/ {5 P)5 z/ X: V, d' {5 `8 r
=> o_childId参数解释:
& Q) N. w* j7 @& L4 B0 nx_cmdDesc=> skill命令输出通道,默认为3) X1 Z+ I0 @5 G& O+ i
x_rESDesc=> skill运行结果接受通道,默认为45 P, i: X" q# r, i
示例请参考ipc文档P44.
% j$ F( D! m" o% R, y! D7 E9 ripcWaitForProcess
% l& k( x, n& Q: N$ Y0 A! O父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用2 o$ B. w! g0 Y
ipcWaitForProcess就可以挂起父进程直到子进程运行起来。/ c# c8 K- g/ S
函数定义:1 g1 `9 e0 O" ~( l8 U) W
ipcWaitForProcess(
3 z! Q* K5 N: N# No_childId
* s3 d" q# c. U! W( I+ t" I[ x_timeOut ]; D, @8 w/ q6 s1 Q( k
)
0 |: J) W5 ?6 x! s3 `' ] Q' Y& Z$ d=> t参数说明:7 R9 o; {" f/ g! J
o_childId=> 子进程的ID
) {% a+ N, k" U$ r4 Y, f0 ^0 Xx_timeOut=>等待的时间
, `4 l0 E1 Z$ yipcReadProcess/ipcWriteProcess
( a' G. q, @5 g' l$ S3 @) c) u这2个是对子进程的读取和写入函数,具体内容参考ipc手册。( F) G& X$ ]( z( P( s
ipcIsActiveProcess/ipcIsAliveProcess3 p% q* v7 k) ~' h0 u
检查一个子进程是不是还有效,类似于查看子进程的state属性
7 w4 t- c4 B1 zcdsServIpc.exe
4 k* `# _7 @$ U- B; @' k要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有/ w3 h! S; u9 j" Z! ?# F
cdsServIpc.exe文件 |
|