找回密码
 注册
关于网站域名变更的通知
查看: 320|回复: 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 编辑
    & B9 Y3 j" E; v# K2 M& F6 F0 a& V/ E5 ]* R
    ipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
    % S1 o% a3 q2 _7 bipc的功能极大的方便了用户做开发。! r) I4 x7 p0 B
    父进程通过ipc和子进程通信. K' _) ^# k6 K% L2 V4 x8 T7 i, K
    如何通信
    4 s; b- K" Y8 P: P6 T父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。
    2 K7 E8 k3 v- P) ie.g. 一个简单的perl程序
    : E. ]* o0 ]3 k  D" b#! /usr/bin/perl -w/ `1 x8 i* _& W) c5 f
    print $ARGV[0];" b0 ~# c% c( H+ F/ ^* ]' k
    getinfo;
      j, i6 \$ p' B. m8 vsub getinfo {/ g$ M0 L6 O5 q- Y2 |. K
    return $ARGV[1];( E) o6 ^# Q; p9 E8 `
    }如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输, C/ p3 j! e# i
    出的值。
    , i; N- K. U( d  K同步,异步读取子进程返回信息, S% Y) C! s7 F) h8 q
    同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏; p. u7 V# U9 G; j6 W: N3 v
    蔽别的程序运行。
    ( U1 O( k. c) M' @, O* I( N% }数据缓存) W/ H/ Z0 ~7 q' s
    一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程& g7 P# a& {$ o: I0 I% E' q
    可以顺利读到这些输出。" F% \3 ~* c8 Z5 O; F5 [3 u
    子进程的属性
    ( W- ^% c" P7 n2 Q子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。
    + ?1 P8 s1 Y  ]  Ccommand Name of the command( v. ^: P* M. a# E+ [0 \( f
    host Name of the host machine running the process& l8 ^4 _0 L% B( p0 m
    processPid Process id of the child process on host
    % W4 Q% `1 g7 texitStatus Exit status of the child process# o' Z. f* {" p, m/ `/ }
    priority Priority given to the child process+ j* {9 W* b! M4 U" D' }
    type Begin, Skill, or Batch process% G! I) ^+ _- O/ J6 Y* V$ i
    state Active, Dead, or Stopped
    ; `' }$ L  S- S+ [$ O7 K' V. o几个主要的ipc函数$ [* z+ J  d. A' D3 {7 H
    ipcBeginProcess! y) o  S" e* e: i8 u% G! O6 S
    该函数用来调用别的程序并返回子进程, 函数定义如下:8 y6 G4 g; |+ o' S/ j
    ipcBeginProcess(8 V$ h" T5 C0 T3 c- J
    t_command0 K, e# D( A- d! H' A
    [ t_hostName ]( U6 j1 M9 N8 [& q
    [ tsu_dataHandler ]
    ; o/ \" S4 u3 i9 k. q7 t2 ^[ tsu_errHandler ]) S* |) |: k  K, [! \: p' X) k
    [ tsu_postFunc ]+ x8 y# I+ G5 }. M" k* g( w
    [ t_logFile ]
    3 \: b1 M( }% b6 U: @, K1 f0 d)- ^& c+ V  P% j  Y
    => o_childId参数解释,+ A+ R2 j& A, c( \9 x1 T7 ~
    t_command=> 要执行的程序/命令,比如linux里面的命令date;
    , ?) @% x2 X6 ~' a& q- ut_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;1 o! ?0 F6 u0 |% X
    tsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就1 R2 _% f7 h9 d5 v  N+ x' k/ y
    是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显; z# J8 Z, p; m& ^0 e! e
    式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;% f6 j+ ?4 E, {& y) A6 G
    t_logfile=>用来记录所有的子程序的输出信息。
    : p( W$ `& [/ A; S! F4 t* y' Q示例:
    : I9 D: [' [2 Y同步读取
    " P3 j: O9 F) [6 H6 ?- jcid = ipcBeginProcess("date") => ipc:0 ;子进程0: q1 h3 \" b- m
    ipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值5 _3 q& N( K. ^" B" j$ H
    异步读取
    9 L  d/ x, Y8 P* z+ c& zhandler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函
    % D* ~( `/ P! f; M' S, |- D( B% T0 Z1 t: K/ W- N3 S
    cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值3 N  N+ |* H6 C( t5 V# R& l
    Date: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess! E9 f9 _7 w8 v3 G
    这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专
    ( y, s) n/ _# t  T门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。
    7 o7 @7 y( S0 b4 P[ tsu_errHandler ]8 b% D' o8 L) ?+ l
    [ tsu_postFunc ]/ j5 w. S$ f* K# B/ I0 V
    [ t_logFile ]3 c7 v+ \& `7 p6 L/ x2 m
    [ x_cmdDesc ], b( s2 K1 M! F  W# O2 C3 j2 L* Q
    [ x_rESDesc ]7 h+ i# R) d3 _8 p/ T
    )
    : j# `1 F- i& h7 y: c# |=> o_childId参数解释:) M% {7 }/ h' f, S% o, I9 v* o0 a
    x_cmdDesc=> skill命令输出通道,默认为3$ R5 p$ U9 S2 z7 H
    x_rESDesc=> skill运行结果接受通道,默认为4
    - ^9 L$ R5 I' H# H示例请参考ipc文档P44.
    3 B( [5 Z! t/ N% f' g! WipcWaitForProcess
      c6 h5 o% r9 |$ G% K- `+ _父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用, H! t$ m( x/ {3 e3 h
    ipcWaitForProcess就可以挂起父进程直到子进程运行起来。5 y% P5 I( Y9 s" I% |7 _4 f/ r% I" N
    函数定义:5 k" w9 }' e( c0 j# ~- }2 z
    ipcWaitForProcess(5 Z8 B2 b8 ~' F/ K# o0 c0 {4 k
    o_childId4 K9 [( @; i- `( C4 f
    [ x_timeOut ]$ u. p/ R8 Q7 m2 ]5 K1 ]. D; k* V' u
    )* y  E5 o" a# f; F
    => t参数说明:
    $ ]8 K# ]# M1 Y- e% Y( \( t+ ro_childId=> 子进程的ID
    $ |5 z8 O& R, a- Ox_timeOut=>等待的时间: _! j/ F4 s  [2 }' m
    ipcReadProcess/ipcWriteProcess9 L/ t: ^! o( {4 S2 q' L/ j! Q
    这2个是对子进程的读取和写入函数,具体内容参考ipc手册。7 S3 L5 t4 i) X
    ipcIsActiveProcess/ipcIsAliveProcess6 i3 e7 P) T2 F6 B' }9 d% ?
    检查一个子进程是不是还有效,类似于查看子进程的state属性) n9 p4 `9 J2 F9 E+ f
    cdsServIpc.exe
    3 v. @1 A4 D. w要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有
    0 r- s$ n1 P0 O# p) A& N: TcdsServIpc.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-7-6 04:16 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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