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

Skill ipc使用方法

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

    [LV.7]常住居民III

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

    EDA365欢迎您登录!

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

    x
    本帖最后由 wqh810914 于 2025-3-11 07:28 编辑
    2 V" @( w, b8 C8 E9 _; ?' t* I. G* M6 ?5 G
    ipc是Interprocess Communication的缩写,ipc使得skill对创建其它非skill进程和与之通信成为可能。
    / f3 x. N, R! Iipc的功能极大的方便了用户做开发。5 C7 L* [, A9 p+ R, A4 y
    父进程通过ipc和子进程通信
    4 n' A* i2 Z4 D如何通信
    * D; P- w$ w/ Z( n父进程通过子进程的stdin将信息传递给子进程,从子进程的stdout和stderr读取返回信息。
    . {! V! a% p3 T) pe.g. 一个简单的perl程序
    ) O( L) i9 P6 N. x5 u#! /usr/bin/perl -w: K% q- `4 R$ l, ^' [
    print $ARGV[0];
    & |8 c( ?+ z# S0 V3 Pgetinfo;
    8 m; W/ r/ w2 J/ y0 s8 ?* Csub getinfo {
    + l: Z! M: D" Q: j. sreturn $ARGV[1];
    9 R1 L' G- m0 ]; G% Y0 |}如果用ipcBeginProcess调用这个简单程序,这个程序运行以后,ipcReadProcess读到的返回值将会是print输6 c- R9 v3 T* C
    出的值。
    & }) t  Q) i' ]2 @7 Z- r$ j* L同步,异步读取子进程返回信息( @1 r; d# z/ M
    同步读取会屏蔽当前操作直到读取完成,异步读取会等到数据和父进程中处理函数都准备好的时候发生,不会屏9 s3 H& v9 L6 U, m% E! i% v
    蔽别的程序运行。7 X; _! G5 }; J: c
    数据缓存
    9 G: A9 ]" Q  e8 C& d! k" R一般的标准输入输出通道有4096byte的缓存区,通常子进程在将数据写入输出通道后推荐刷新该端口使得父进程
    : n4 [! Q& L. w7 Y% l) O可以顺利读到这些输出。+ p7 E8 N8 k& H" ]3 l4 ]
    子进程的属性
    ) L! {; Y& Q% F" g0 I子进程通常有如下的只读属性, 和其它的skill对象一样可以通过"->"来读取。
    ) B1 b! e: n8 c. \9 e! f; ncommand Name of the command
    ) B7 H4 t) C6 O6 \, g6 i: i$ K" Hhost Name of the host machine running the process1 S. ^" c) L! Y& W# ^, e1 [& u/ p
    processPid Process id of the child process on host
    5 X6 h" {0 R& d5 D9 N" |exitStatus Exit status of the child process' V2 X# ?% h) ], S  d
    priority Priority given to the child process
    0 q$ s& z* q" P* C' L0 D: u+ @type Begin, Skill, or Batch process
    # {6 S3 `3 k% X! Z3 z' I( T% {, zstate Active, Dead, or Stopped8 u) W( o9 X3 [) m. }' ]$ ~3 w
    几个主要的ipc函数
    ; }1 ~7 m' n2 ?3 HipcBeginProcess
    ) o7 h( G$ ^+ w7 w4 t  ^4 s9 A该函数用来调用别的程序并返回子进程, 函数定义如下:
      }; Z# c2 H; T* _9 n# d' k$ ripcBeginProcess(
    + G* w0 ]- o) vt_command
    ) `8 \- a' ]$ o" f3 C, Z[ t_hostName ]
      p9 `6 m6 M& f+ q[ tsu_dataHandler ]
    * d' x! y  n* n[ tsu_errHandler ]
    8 L* B5 B7 H2 K' Q& o+ h+ {[ tsu_postFunc ]
    + n# u' R! _- ~$ ]/ n' F[ t_logFile ]
    3 ~; l) B9 z8 U+ m) h0 ^)
    + ~1 B1 S! ?, A7 [=> o_childId参数解释,
    0 c0 p3 }  c. q& o- D$ }/ z' Ut_command=> 要执行的程序/命令,比如linux里面的命令date;9 b# y$ t# x% q  f; q' Z9 H# o
    t_hostName=>被调用的命令执行的环境,null也就是“”表示在本地执行;
    1 w* Z: g9 M7 Ftsu_dataHandler/errHandle/postFunc=>这3个参数用来处理子进程的输出,如果设置了相应的处理函数就
    & K! D$ {: @) W# T, T! t是异步读取方式,这种方式会自动读取子进程的返回值,如果没有设置则是同步读取方式,这种方式下就必须显$ U/ E# P! ~  ?- u
    式的用命令 (ipcReadProcess,ipcIsActiveProcess...)来读取子进程的输出值或者状态;( j$ J5 q" a7 |1 ]* U4 W
    t_logfile=>用来记录所有的子程序的输出信息。# @& |% l) d% B1 U0 }+ k
    示例:9 X4 Q' S. F3 t* i2 D3 J0 y
    同步读取# Q% F5 d+ v. N" K
    cid = ipcBeginProcess("date") => ipc:0 ;子进程0
    # d& }6 N- b' p# eipcReadProcess(cid) =>"Tue Aug 1 14:23:07 PDT 1995\n" ; 显式的读取子进程的输出值; A& @9 {4 w- H' M0 e
    异步读取* o6 s1 u5 A* f3 x
    handler = (lambda (cid data) printf("\n Date:%s\n" data))=>funobj:0x2848e8 ;定义输入数据处理函
    * k$ o) `/ T/ F% h+ a5 H# m9 q
    - w+ @9 [6 C( H& d# Acid = ipcBeginProcess("date" "" handler)=>ipc:0 ;handler会自动处理子进程的输出数值3 _- K/ @: {% V7 v
    Date: Tue Aug 1 14:29:17 PDT 1995ipcSkillProcess
    , I! S4 v$ k  l; f这个函数类似于ipcBeginProcess, 只是增加了对子进程可以在父进程中执行skill命令的能力,以及设置了2个专
    % ^2 _! m, Y# ^; B% C6 o$ g门的通道方便子进程输出skill命令到父进程执行并读取执行的结果。
    6 j1 \: P* d$ M7 R. s4 b5 B[ tsu_errHandler ]
    5 m1 P2 s' N. v2 t. J4 B. \[ tsu_postFunc ]& g. a3 O( [; f9 F1 Z
    [ t_logFile ]8 I  V9 d! v6 a2 H
    [ x_cmdDesc ]
    8 A1 i8 P$ @$ d. V# u  Y' U, r+ B[ x_rESDesc ]
    ' Z4 L! ]0 E' n0 ?/ {5 P)5 z/ X: V, d' {5 `8 r
    => o_childId参数解释:
    & Q) N. w* j7 @& L4 B0 nx_cmdDesc=> skill命令输出通道,默认为3) X1 Z+ I0 @5 G& O+ i
    x_rESDesc=> skill运行结果接受通道,默认为45 P, i: X" q# r, i
    示例请参考ipc文档P44.
    % j$ F( D! m" o% R, y! D7 E9 ripcWaitForProcess
    % l& k( x, n& Q: N$ Y0 A! O父进程调用子进程的时候,可能由于系统的延时子进程不能即刻就执行,考虑到这样的一个延时用2 o$ B. w! g0 Y
    ipcWaitForProcess就可以挂起父进程直到子进程运行起来。/ c# c8 K- g/ S
    函数定义:1 g1 `9 e0 O" ~( l8 U) W
    ipcWaitForProcess(
    3 z! Q* K5 N: N# No_childId
    * s3 d" q# c. U! W( I+ t" I[ x_timeOut ]; D, @8 w/ q6 s1 Q( k
    )
    0 |: J) W5 ?6 x! s3 `' ]  Q' Y& Z$ d=> t参数说明:7 R9 o; {" f/ g! J
    o_childId=> 子进程的ID
    ) {% a+ N, k" U$ r4 Y, f0 ^0 Xx_timeOut=>等待的时间
    , `4 l0 E1 Z$ yipcReadProcess/ipcWriteProcess
    ( a' G. q, @5 g' l$ S3 @) c) u这2个是对子进程的读取和写入函数,具体内容参考ipc手册。( F) G& X$ ]( z( P( s
    ipcIsActiveProcess/ipcIsAliveProcess3 p% q* v7 k) ~' h0 u
    检查一个子进程是不是还有效,类似于查看子进程的state属性
    7 w4 t- c4 B1 zcdsServIpc.exe
    4 k* `# _7 @$ U- B; @' k要保证ipcBeginProcess能执行,先确定在软件的安装路径下<Install_Dir>\tools\bin文件夹下有/ w3 h! S; u9 j" Z! ?# F
    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-11-23 01:15 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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