找回密码
 注册
查看: 89|回复: 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 编辑
    ( f  E& [3 v9 S3 w1 |
    1 [4 E) d4 K% K; |" w& x4 _4 ^$ W/ Iipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
    ) d3 m; P  V# Q8 w. wipc的功能极大的方便了用户做开发。
    ; E% h& K: Q4 x2 s% H5 M2 ?( u父进程通过ipc和子进程通信
      ?( g+ U8 _; J; E1 X! x7 s如何通信& E6 W7 L9 M& A1 w0 X
    父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。
    & S. s$ K3 z/ a* X6 f3 ^$ }7 c- @e.g. 一个简单的perl程序
    7 B2 C+ |: \. c#! /usr/bin/perl -w0 H5 b: ^3 u! ~0 C8 G9 |( W6 @
    print $ARGV[0];
    1 l$ t% e/ b: t9 K) P/ j3 Z6 sgetinfo;/ ]( G/ x& p- g$ V
    sub getinfo {
    & C8 J' t9 w3 {( y: ?6 @return $ARGV[1];) M7 o3 v  p$ o- p2 o* G
    }如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输
    8 [8 g+ a- k6 u出的值。3 t9 c8 D; G, y3 w6 N
    同步,异步读取子进程返回信息
    & e& t3 v# c8 s! b. p同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏. U, c7 I6 ~) O1 j/ W0 O3 w* d! [
    蔽别的程序运行。
    ! a2 V/ @) ^  z1 V1 _5 Y: k) v+ w. S数据缓存4 O$ p" h5 B- Q8 Z3 y- W8 U" p5 K
    一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程% L. a& X/ P( v9 \' n2 |
    可以顺利读到这些输出。
    - w2 `( z3 p: F- @子进程的属性; B7 i! V7 f. P8 {
    子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。, U6 }+ w7 |7 a
    command Name of the command1 s/ K6 ?4 g: X% L* j6 Q4 ]
    host Name of the host machine running the process
    / P' x# Z. L* k. S' p5 pprocessPid Process id of the child process on host
    1 o3 b3 E9 }# c. A1 yexitStatus Exit status of the child process. i( J- w5 W9 ?8 b
    priority Priority given to the child process
    " c4 h  e' Z/ O+ _" _! f% C  S5 Ftype Begin, Skill, or Batch process
    4 A: C. w: D3 h- a" k# Tstate Active, Dead, or Stopped- r$ w& g& o2 ?% {5 z5 r$ ^. R
    几个主要的ipc函数/ _- `% g$ @0 U2 W* L! D/ L
    ipcBeginProcess2 }  z/ n" f: H9 _$ G' N
    该函数用来调用别的程序并返回子进程, 函数定义如下:
    # a+ H6 m9 `3 q/ B9 d5 O3 dipcBeginProcess($ Z8 e( J$ _' s# }
    t_command
    + T; d3 g3 o8 }4 H# X4 r8 P1 q, H[ t_hostName ]% i% M/ h: o6 S4 m" l
    [ tsu_dataHandler ]
    6 J3 D$ B/ V, S- n8 B) r[ tsu_errHandler ]
    , D* U2 E7 d7 A  Y2 A[ tsu_postFunc ]
    / @$ ^5 T& Z6 f; r( l( _; W7 e[ t_logFile ]/ x3 t- n! l* h& F
    )
    & H7 e' P7 Z- f=> o_childId参数解释,* J' p2 Q+ I* J2 \) l3 O' j
    t_command=> 要执行的程序/命令,比如linux里面的命令date;& @) t0 \+ d; y) D7 f! y
    t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
    . Z' q1 i( A% }* n: a0 ~tsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就7 {9 E$ U5 I/ a+ Q" p4 [
    是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显9 A7 \/ D# N: R) u
    式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
    4 H5 q! ~+ Q- F4 V$ p5 Ut_logfile=>用来记录所有的子程序的输出信息。
    6 u3 G% n$ |/ F  }* z示例:! Y6 K2 e' a. c. M- V% N, v7 a
    同步读取  B& Q$ A; [6 @& g; {( f5 l4 N
    cid = ipcBeginProcess("date") => ipc:0 ;子进程01 K+ ^4 e5 p, O  q
    ipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值
    ' `" Q" ]1 a) {/ B0 T3 U* X: v异步读取! r0 d/ t  F. @9 f' c* Q5 @6 r9 M
    handler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函& a/ J( A7 S2 m7 _3 `$ k& s

    0 u8 p* z9 W8 k1 `cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值
    3 F: u- ?! D: x0 m, m. X# BDate: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess
    & r- ?0 t" l9 O+ z$ \; k! E这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专! [, E# y6 L* K8 J' L& F
    门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。8 s% z4 _+ f4 T8 d7 l, e5 `% p
    [ tsu_errHandler ]
    9 I9 ]; \4 q9 @[ tsu_postFunc ]
    + a. m3 x; O/ j) t" W[ t_logFile ]+ M; P1 H4 T; f7 E' p" [) `& o6 p
    [ x_cmdDesc ]
    8 f+ f8 ]* B- b, I0 Q% c[ x_rESDesc ]7 c8 j' _) L, H) s7 W' E. G$ U6 I1 U
    )
    ; A0 ?0 t' b* D. \( u7 A5 u+ W6 X=> o_childId参数解释:. w" ~2 w, y. V5 z
    x_cmdDesc=> skill命令输出通道,默认为3$ w$ ]( w+ d. F; d9 ~) ^# g1 w& [
    x_rESDesc=> skill运行结果接受通道,默认为42 x' v- |# e7 T. \) k- Y% u% T
    示例请参考ipc文档P44.
    1 [* ^5 e+ d1 b) u0 f1 M9 fipcWaitForProcess
    / @0 p. o) `$ h# ]! c父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用
    1 v8 W; L) j  \! B2 k% \9 u. ^ipcWaitForProcess就可以挂起父进程直到子进程运行起来。
    ) C% c+ s: W! ^! ~函数定义:5 ?; T7 Z8 ~2 K: e5 k% l
    ipcWaitForProcess(
    3 ~" r# ^( F6 a: V& y3 co_childId1 Q; G! `1 Y8 y' J
    [ x_timeOut ]6 W! |9 s1 d* f2 j
    )
    2 `) j2 J4 P3 |8 @=> t参数说明:! n* H% l+ n3 N2 z! A8 n/ z
    o_childId=> 子进程的ID
    " v+ c% e, x- Q4 D1 k& yx_timeOut=>等待的时间' i0 b% A, _' t7 Q
    ipcReadProcess/ipcWriteProcess
    ; M- A/ }. J7 U- J0 i$ ~0 I% M这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
    : ~1 u& x* w( J0 lipcIsActiveProcess/ipcIsAliveProcess$ A$ f# P- l  y8 d
    检查一个子进程是不是还有效,类似于查看子进程的state属性
    6 y* b( n5 ]7 c- M1 ]cdsServIpc.exe
    ' I2 E! C& W+ l( p要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有4 |' g& e/ ?0 `6 w
    cdsServIpc.exe文件
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    3#
    发表于 2025-3-11 11:01 | 只看该作者
    沒玩過 SKILL 和 封裝工具 的通訊.
  • 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-3-12 03:02 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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