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

Skill ipc使用方法

[复制链接]
  • TA的每日心情
    开心
    2025-11-21 15:35
  • 签到天数: 125 天

    [LV.7]常住居民III

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

    EDA365欢迎您登录!

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

    x
    本帖最后由 wqh810914 于 2025-3-11 07:28 编辑
    . q7 X5 l. ~3 I7 [' g  C
      ~) d7 D1 o( m+ Lipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
    " i( C9 o' n  Z2 R# nipc的功能极大的方便了用户做开发。! w) ]& w4 u2 U4 R# V# Z$ m
    父进程通过ipc和子进程通信) h  P+ q+ p: u9 k+ X* p3 d; {( c' E
    如何通信* i& j7 i! g7 G+ U
    父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。: k9 X; c; w" D2 N# j$ W
    e.g. 一个简单的perl程序
    & z3 y0 p7 z+ y* a: v#! /usr/bin/perl -w1 x& b. j4 Q, [: h: ]
    print $ARGV[0];: c' A. H) P* s7 G3 D
    getinfo;, ~; p. x' o* U  \3 |: ]5 F
    sub getinfo {) J" p: r+ {# R( O- C
    return $ARGV[1];+ l# \" v4 q) Z0 h: W& v* V
    }如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输
    0 x) \+ w7 g& x- N出的值。; |: N7 Q8 `6 y) r
    同步,异步读取子进程返回信息
    6 K3 c* Q  r: |9 A' [1 C) a+ I同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏' e: j. j. e- t0 N3 @% B) y' h
    蔽别的程序运行。8 h; P6 y: A! T4 f% B
    数据缓存+ b6 C& z3 }: I9 w- b
    一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程& y8 `7 ?% [9 r5 Y+ T$ e8 x: g
    可以顺利读到这些输出。) g" E) P* x. ^2 ?
    子进程的属性( M9 r* w0 J1 W! Y& q  w2 n$ j' ?! z
    子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。$ _  y, u2 `7 G3 ~, I1 U2 @
    command Name of the command5 A& |/ S9 {3 Q; A, o3 e# H. b
    host Name of the host machine running the process
    / A8 [( Y, v; p$ W% h( }processPid Process id of the child process on host
    # c% E, w2 g4 |! f, Q8 TexitStatus Exit status of the child process
    7 a, f, w& `% b$ ]priority Priority given to the child process
    . a3 q/ h% J' ^$ F2 g7 Dtype Begin, Skill, or Batch process
    9 D9 c; g# b) ], t& q" cstate Active, Dead, or Stopped
      N6 z# g. v! Q9 }几个主要的ipc函数
    9 i+ r; [1 c6 g" `9 vipcBeginProcess
    ! u; H8 S0 w: s4 w该函数用来调用别的程序并返回子进程, 函数定义如下:: ^- v- n8 l+ b' g, Z0 n
    ipcBeginProcess(
    ) S1 u& T5 K# H# d4 s8 A1 G0 v3 H% Dt_command
    2 n. h8 G; @. \) P0 t. O# R[ t_hostName ]' U" U4 b4 ]# [3 i
    [ tsu_dataHandler ]" W4 `$ ^  @; `7 _; R
    [ tsu_errHandler ]
    2 D7 O9 W( a* _[ tsu_postFunc ]
    + C! [$ `; o* D/ f# L: B) k[ t_logFile ]' o1 K' A' o& G% Z3 z; ?5 K
    )
    % `+ Z5 \; J& R' X=> o_childId参数解释,$ N: X: v6 ~- ]
    t_command=> 要执行的程序/命令,比如linux里面的命令date;( |8 H& ?: ^4 `/ I0 p) a" s
    t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;/ v+ L' l( H/ C- g6 n
    tsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就6 o; f8 k' F* f  b
    是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显- ~. h5 v7 M6 [
    式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;
    6 S/ p& ]3 C4 g, L+ Jt_logfile=>用来记录所有的子程序的输出信息。# p& X. X, ?5 Z( C2 \6 {
    示例:* k& u) }7 s) j7 O
    同步读取
    ) Q$ \+ x- |: M/ p5 j. ?cid = ipcBeginProcess("date") => ipc:0 ;子进程0
    8 b5 e7 N4 B8 ?' j1 q" F) SipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值
    # w  Y4 Y% f5 L  ?% e- D7 n异步读取
    ' u8 c+ s3 d+ A8 D" `' y0 Y! z- chandler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函
    8 p, O7 H" i1 x: p, V' s0 y$ Y! ^1 n8 e
    cid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值8 ~- x- U+ Z$ y' J8 \
    Date: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess) X$ c2 ]7 Q8 e' q' i
    这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专
    2 M+ K$ G7 `/ T$ v门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。3 A. e. z3 W# E8 W
    [ tsu_errHandler ]
    1 }( D8 H/ q4 Z. X+ P9 P[ tsu_postFunc ]
    7 R. o7 X# m" J; J[ t_logFile ]
    3 d# l& m4 I( x[ x_cmdDesc ]# H: G3 [& h# w) m$ B5 h; m
    [ x_rESDesc ]
    ) ^. h2 B# s. @5 n)
    , _% K& ?  L# `  j=> o_childId参数解释:
    8 Q8 h) B, F" A! x5 T- r* y+ t. Tx_cmdDesc=> skill命令输出通道,默认为3
    ! c2 ^: ~1 J5 @) sx_rESDesc=> skill运行结果接受通道,默认为4
    * }4 c5 x6 d9 b. B5 C+ U% `示例请参考ipc文档P44.
    - S4 o& B- q! [6 [6 d+ ^, x* AipcWaitForProcess
    ( u# V1 }$ ~, U7 \) Z父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用
    + U7 n$ F* b2 Y: qipcWaitForProcess就可以挂起父进程直到子进程运行起来。# N" e+ x$ r8 r, x$ d
    函数定义:' W$ m) ?& E$ n* B/ e% |% D, Z
    ipcWaitForProcess(
    / R" `8 o9 h# H* O) Do_childId8 j% x+ J- V3 Q  A* Q4 G( C+ c) T
    [ x_timeOut ]
    , f" j8 j# k& n1 L$ P7 a+ W)1 `* c2 c+ b  ~$ r
    => t参数说明:/ F# B$ h) y; s3 J
    o_childId=> 子进程的ID6 B& C9 G6 ]7 K# a
    x_timeOut=>等待的时间5 U3 J1 s; T* t) a
    ipcReadProcess/ipcWriteProcess; ~: s, K! _( @* M2 P
    这2个是对子进程的读取和写入函数,具体内容参考ipc手册。
    - U+ J& \9 g9 Q' y" V" GipcIsActiveProcess/ipcIsAliveProcess
    . c8 L* H- j5 |6 a# u检查一个子进程是不是还有效,类似于查看子进程的state属性& S7 m. o' b) f+ n
    cdsServIpc.exe
    . V, f: G& z9 K1 K. n要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有% v6 q- }* @1 e# E3 w: y2 ]1 ?
    cdsServIpc.exe文件
  • TA的每日心情

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

    [LV.7]常住居民III

    3#
    发表于 2025-3-11 11:13 | 只看该作者
    举个例子,说说功能,大佬
    头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    2#
    发表于 2025-3-11 11:01 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-23 02:32 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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