找回密码
 注册
关于网站域名变更的通知
查看: 482|回复: 3
打印 上一主题 下一主题

Skill ipc使用方法

[复制链接]
  • TA的每日心情
    开心
    2025-10-27 15:12
  • 签到天数: 121 天

    [LV.7]常住居民III

    跳转到指定楼层
    1#
     楼主| 发表于 2025-3-11 06:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    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文件
    头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    3#
    发表于 2025-3-11 11:01 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽
  • TA的每日心情

    2021-1-21 15:57
  • 签到天数: 121 天

    [LV.7]常住居民III

    4#
    发表于 2025-3-11 11:13 | 只看该作者
    举个例子,说说功能,大佬
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-2 00:09 , Processed in 0.140625 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表