找回密码
 注册
关于网站域名变更的通知
查看: 363|回复: 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 编辑
    - S5 a1 Y: b5 n& [  {$ {7 C( r# O( E: u
    ipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
    - e6 C8 `7 B% c. a7 Kipc的功能极大的方便了用户做开发。/ d8 S0 z' F" A
    父进程通过ipc和子进程通信+ q: b4 k* s& x5 G/ j7 y
    如何通信0 y* R6 }/ I; {' X
    父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。0 Z# Y; _3 Y% m1 L0 X
    e.g. 一个简单的perl程序( [. w; f* L. c, ]- {
    #! /usr/bin/perl -w
    2 D( w2 a9 y6 ~3 Dprint $ARGV[0];4 B* o0 S4 e! m6 h- J  r5 C
    getinfo;
    , p6 D* q: J8 F1 K1 V2 ?sub getinfo {
    + e7 j7 Q* m% t! {+ c+ kreturn $ARGV[1];
    & \+ T  [. K8 Q& O3 _$ f9 v& c8 |/ u}如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输) B4 k4 T+ ~$ D" V& |1 [! Q' Q
    出的值。- J; D; @# ~* h$ d; p" h
    同步,异步读取子进程返回信息( R! X# B  K! Z
    同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏
    3 `+ E) ^3 E7 {蔽别的程序运行。
    " a1 r& b4 G4 m" @# S4 ^" o数据缓存3 G& i# q( Q, E" Q' X: {) a" e9 b0 W
    一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程
    1 H" ^; O, m! y' d% R可以顺利读到这些输出。5 V& ]! a. C, U4 v4 t! G! ?) ~& Y
    子进程的属性
    ; x6 \) r" u2 u* J子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。
    ! D' ~, D9 I0 O" U9 Kcommand Name of the command
      e$ J4 k6 |- ^5 J5 ^, g7 C: Xhost Name of the host machine running the process
    . K% I+ ~( W3 B7 ZprocessPid Process id of the child process on host
    2 O) w) M/ ^" Y# Q8 x, mexitStatus Exit status of the child process* P/ k6 M3 N( Y  {. S7 ~
    priority Priority given to the child process
    . c- I4 e. N, s, rtype Begin, Skill, or Batch process
    0 c+ r% H8 I( ystate Active, Dead, or Stopped
    - L7 [5 [, u5 l2 d4 J* m2 t几个主要的ipc函数% n6 Y# ]- p5 @, i" e
    ipcBeginProcess8 j2 U  y* ^$ T4 B7 v9 N
    该函数用来调用别的程序并返回子进程, 函数定义如下:4 {& N" Z& z+ H" b7 l
    ipcBeginProcess(( N' G& v" @8 E6 H2 L
    t_command
    & S3 [% n, o% J) E2 W) t+ D; d[ t_hostName ]/ I2 G& U3 k$ ~! G  P# u, E  r
    [ tsu_dataHandler ]4 D* s5 n& Z- \7 c; w
    [ tsu_errHandler ]; O2 q$ h* E0 j  l* L% E3 j
    [ tsu_postFunc ]
    ) d2 o2 [1 [, C4 m1 X[ t_logFile ]
    7 e) f6 b: w2 l); u( _- u& B9 r7 W. n- o6 y1 p5 h3 U
    => o_childId参数解释,
    + Y, o' d- R! q! Y( R& ft_command=> 要执行的程序/命令,比如linux里面的命令date;
    4 J1 A# P) F, ]/ M! \t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
    6 B+ L% r# Q; T5 p! ?- v2 ttsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就
    " m# d+ W% c# }7 Y& {: x! \3 B是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显* e, Y: S( r) j4 k$ J+ i
    式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
    . g* k% k: Z; P+ i; m7 it_logfile=>用来记录所有的子程序的输出信息。
    3 i5 g' ]0 ^6 G0 p7 ~  s示例:
    8 T  {; g! _3 h" ~1 D; c. t5 z8 h同步读取
    5 p! U% t( Q; n) j) p: y1 K3 ~cid = ipcBeginProcess("date") => ipc:0 ;子进程0
    1 N  a0 X" h2 d) g, fipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值
      i# e& _  E! F: M  |: e( Q9 d$ R异步读取% b# v- o" |8 c; U( d9 n" i
    handler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函
    " j5 [% L5 A8 Y+ Q. O2 n# Z5 y  b: k
    cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值8 |! Z$ c6 h5 C* K4 q
    Date: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess
    / w/ z  Z5 J7 d这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专/ v1 I) \: ?4 q( K7 T  P
    门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。
    / y. p8 D+ N/ W; A1 E[ tsu_errHandler ]9 k$ c! L1 T1 X/ B6 H. Q0 R
    [ tsu_postFunc ]
    ! [" }8 c. x. \& [9 r[ t_logFile ]
    & D: S8 o- v& I) u, U6 \5 E; M+ o[ x_cmdDesc ]- m* Q6 w! \  C' Q$ U1 ?0 ~
    [ x_rESDesc ]; i& h( e- _; f- i; {3 K
    )* L3 _! n5 Q1 O8 R; D; O
    => o_childId参数解释:
    3 v( v  G& P- |( ~( Sx_cmdDesc=> skill命令输出通道,默认为3
    1 D" x5 j, t; i: ^x_rESDesc=> skill运行结果接受通道,默认为4
    5 g9 }4 m. L, ]8 }% ?示例请参考ipc文档P44.
    3 h; p  ~( x* H5 qipcWaitForProcess& d+ w& v6 h4 d# S' \% j  y
    父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用2 b  v/ J4 r2 Q- p
    ipcWaitForProcess就可以挂起父进程直到子进程运行起来。
    7 x% B* Q1 b9 w0 V8 ?* ~函数定义:; L' U8 \( B+ m/ z
    ipcWaitForProcess(
    % O  e4 O. ~: c1 Po_childId5 L/ r; X2 U5 [8 M! u" D  @1 d  |
    [ x_timeOut ], D0 ^& z6 w' b$ R7 j$ d
    )
    ; a6 u. G; Q9 m; J" X1 N5 B=> t参数说明:/ C- a$ x& f! O8 z
    o_childId=> 子进程的ID# f6 ~; y5 I1 y0 q; ^9 L
    x_timeOut=>等待的时间
    + \$ n  p& N) [% U# w+ RipcReadProcess/ipcWriteProcess
    9 c' _  f0 I. a  W这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
    6 l2 I: |3 [: p% a  zipcIsActiveProcess/ipcIsAliveProcess
    2 @1 }$ a& a3 ~) I1 w- j, d检查一个子进程是不是还有效,类似于查看子进程的state属性' r" a' ]$ G8 ]
    cdsServIpc.exe
    9 ^  ]; x4 {8 s要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有
    4 y! v1 a3 k% ^& Y8 ?0 VcdsServIpc.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-8-1 22:30 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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