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

Skill ipc使用方法

[复制链接]
  • TA的每日心情
    开心
    2022-4-17 15:15
  • 签到天数: 116 天

    [LV.6]常住居民II

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

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 wqh810914 于 2025-3-11 07:28 编辑 ' R2 }  Y7 Z2 S3 B& g: B1 `) x
    - L* M0 n& H  G1 i
    ipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。6 ?5 q& L* s' p. p5 f, P
    ipc的功能极大的方便了用户做开发。. L9 w5 s7 t: Y) _0 ^
    父进程通过ipc和子进程通信# f. H6 z2 u1 d7 X
    如何通信" T6 Z8 w( x6 ^: t# B  W; ~
    父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。
    " G6 x: B" n7 \e.g. 一个简单的perl程序
    9 X$ R' |, ^1 N! X" {( \6 E#! /usr/bin/perl -w# B9 k0 E+ H  q% L& ^* S* N, u
    print $ARGV[0];7 j/ J) G7 ^# d! |
    getinfo;
    $ a% {: `5 H* t8 D. xsub getinfo {9 y6 N6 T5 D, i! g3 X
    return $ARGV[1];, _7 w. y. y" a- F/ F
    }如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输
    7 i, s3 e, U0 U/ H1 Z: ?# {3 K出的值。
    . [! `+ L. T! w/ i# U. w3 k同步,异步读取子进程返回信息
    ; L0 T8 t0 l& X同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏( O. ?* H( d7 f& v. a- ?
    蔽别的程序运行。: u1 e# o4 Z( q! V3 ~
    数据缓存/ o; P1 g( a, c
    一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程( r9 R* j' s$ e
    可以顺利读到这些输出。
    $ G* j9 U, x# [0 l8 A6 H子进程的属性$ ?3 w+ p% A0 d: J( p; A  Y
    子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。
    ( N7 g7 \  k" kcommand Name of the command
      q0 ^! G9 w; _- |1 l8 q. g# ]; w; ohost Name of the host machine running the process; P* m3 v: s- S' G1 l, n6 Z$ g5 Y+ s
    processPid Process id of the child process on host5 n( n! C/ {! i3 z3 i( h
    exitStatus Exit status of the child process
    2 `+ y' h; x6 g2 }- B" p; o3 \4 n8 Qpriority Priority given to the child process
    6 c/ X& I5 n8 x. ztype Begin, Skill, or Batch process
    & B$ z. `3 \" A# b$ l. q( J& Wstate Active, Dead, or Stopped$ T3 S( a5 t& {" t5 a' E
    几个主要的ipc函数
    3 S, F8 o" G5 oipcBeginProcess7 W: i8 e/ e# H1 _: l! X) R$ B
    该函数用来调用别的程序并返回子进程, 函数定义如下:
      h! Z7 h5 C1 r1 H3 `9 ]% [ipcBeginProcess(
    - D) D# z5 D. g2 ^8 O( _t_command
      `+ G/ t1 L6 Y( q, [  w[ t_hostName ]4 x8 W  v" D  s* a0 |
    [ tsu_dataHandler ]* ]1 O! p. E6 I; q0 Y" h$ b
    [ tsu_errHandler ]- P6 d/ y" j$ D2 v3 N9 J
    [ tsu_postFunc ]
    ; ?# e- G8 m, |- @+ U  s[ t_logFile ]
    ' s) B' A( [; f+ h. K0 c)
    % @8 ^; R. Y+ H- p! G! \) ~=> o_childId参数解释,
    # r2 z6 X* N* q# i1 H  _5 D7 `% dt_command=> 要执行的程序/命令,比如linux里面的命令date;% z% b0 l; m# V1 n* l0 I; |
    t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
      g. ^6 `$ a) g6 @( otsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就
    3 C9 s& j! q7 k/ _- l3 A是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显
    1 J% g6 m  d- e2 D% C& y/ ^式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
    2 Q" ]1 F7 w. Q2 i( X" _& Ot_logfile=>用来记录所有的子程序的输出信息。
    ! |  B6 l+ j6 t/ G3 B# M9 n9 h示例:
    0 f  G) ?) _, }6 `同步读取
    ) R$ [$ |8 E/ R7 i( @9 ]3 q/ D! hcid = ipcBeginProcess("date") => ipc:0 ;子进程01 p# R3 Y) b$ _6 W% ^: e. m
    ipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值7 a& E* I; s0 @" ?3 Y3 v
    异步读取
    ( y* b& \/ u* Z4 O+ h# F! P2 Hhandler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函. e" y! f/ b& L- C/ ^' t

    " l; O8 \3 M, [  ?0 V. N1 u, Xcid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值
    6 r3 ^' i2 u2 u5 HDate: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess
    ' {* S/ `) J$ d这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专( Z" E1 i, {4 R1 o# ^3 k6 V
    门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。4 i1 z4 |& F, Y$ E. z
    [ tsu_errHandler ]$ I6 z; E% g. l' R) V7 c( g
    [ tsu_postFunc ]# \( k; I" T& `$ G* Z( [1 }
    [ t_logFile ]
    & S2 U' u0 E* j% K; e0 H+ X[ x_cmdDesc ]
    : F* A: g! d  P8 |8 j[ x_rESDesc ]
    $ h) z: Z% ]" X# }  ]1 h9 X: p)
    " g. K, Z" P0 `. A=> o_childId参数解释:# F; D; V$ S6 R& R' ~8 I0 g6 W- G2 Q' C
    x_cmdDesc=> skill命令输出通道,默认为3
    & I) g0 P" i& `) k) G$ bx_rESDesc=> skill运行结果接受通道,默认为4) [8 u& v$ t3 s3 |
    示例请参考ipc文档P44.
      I% p3 U1 v, q' \3 `& mipcWaitForProcess* T! w" z( C; H3 P- F
    父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用
    " H: v, N8 s3 P. aipcWaitForProcess就可以挂起父进程直到子进程运行起来。( F% ?3 X( k* V2 T- B; ~
    函数定义:/ M& q- }6 @! a& B$ [: ?
    ipcWaitForProcess(
    ; D' ~8 h0 f( o2 U5 o$ Go_childId
    0 f; Y8 I# i- w) Y" w6 m, c[ x_timeOut ]
    9 V% @8 s  Q2 Y5 _- F)
    " W& J* h, ?& [5 v8 {' c=> t参数说明:7 n8 n4 h$ L- L
    o_childId=> 子进程的ID1 u1 C* Y% d" t/ }% ?
    x_timeOut=>等待的时间
    7 S% D/ U* H6 I* V* ^ipcReadProcess/ipcWriteProcess
    - T; }# W# [: |: v( A- Q4 i这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
    + l* ~  ^7 @: e1 v4 UipcIsActiveProcess/ipcIsAliveProcess
    4 {  T+ {7 o% ]7 H1 ?3 h' R检查一个子进程是不是还有效,类似于查看子进程的state属性
    ' @9 B1 q* b5 M; g* H- dcdsServIpc.exe( j8 h9 h7 E* F1 g1 b
    要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有" n3 d# _4 _% K' {* W' A6 N
    cdsServIpc.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-6-24 21:26 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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