[QNX] 用mcd实现存储设备自动挂在
Ref DOC : QNX_Neutrino_RTOS_Utilities_Reference.pdf
注:MCD 工具只在6.6之前的版本可以使用,7.0上已經將它的功能整合給了其他工具
一 mcd 簡介
mcd是可以用來檢測某個設備或者某個文件是否存在的工具,并且可以根據檢測結果做出相應的反應,比如,如果某個U盤pluged,那麽/dev目錄就會有相應的設備文件,儅該文件存在,就可以執行想要的觸發調用.
用法: mcd options config_file ,具體options可以用use mcd查看或者參考文檔
二 配置文檔
mcd必須要配置文件才能執行任務.配置文件以段為單位.
一個段以[section]為開頭,其中section 可以是:
1. 設備 / 文件 實例, 比如: /dev/hd0 , 那麽 段開頭就是 [/dev/hd0],這表示,需要mcd 監測 /dev/hd0這個文件,这种段称之为 entity section
2. 一條規則,比如 [RULE_NAME],一条规则的section并不检测任何文件,只是作为一个子分支供父段调用,这种段称之为 rule section
一个例子:
注意:配置文件不能以空格开头或结尾 ,可以用#当作注释
实例段支持的语法如下:
[section]
Callout = Callout_name #当定义的文件被监测到,执行的调用 或者说是通知机制
Argument = args #传递给callout的参数
Priority = value #线程优先级,建议没有特殊情况不用设定
Start Rule = XXX #文件被检测到时,调用的子段(rule段)
Stop Rule = XXX #文件消失时,调用的子段(rule段)
规则段支持的语法如下:
[section]
Callout = Callout_name #
Argument = args #传递给callout的参数
Priority = value #线程优先级,建议没有特殊情况不用设定
Match Rule = XXX #Callout执行成功,如果还有后续的rule,定义在这里
Fail Rule = XXX #Callout执行失败,如果还有后续的rule,定义在这里
#如果没有后续的rule,则到当前rule结束
#mcd 读取配置文件,监测指定的文件,根据文件的存在 / 消失, 调用对应的Callout, 如果指定了start / stop rule, 在callout执行完之后,查找对应的 rule section 继续.
三 Callout
mcd支持的callout 分为两种类型,build-in 和 extension .
build in Callout如下:
[Entity section] 支持的callout
CD_MEDIA_IOBLK
USB_MEDIA_ENUM
PATH_MEDIA_PROCMGR
PATH_MEDIA_SCAN
[rule section]支持的callout
DVD_OR_CD
CD_AUDIO
BLANK_CD
FNAME_MATCH
FNAME_PATTERN
MOUNT_FSYS
UNMOUNT_FSYS
Extension 允许自己实现触发某条section时的callout,格式如下:
Callout = [email protected]_ext_lib.so
@表示这是extension callout, @前面时func name, 后面时lib name.这样,mcd运行时会动态加载指定的库,并在触发该section时调用my_func
四 测试用例:
用mcd自动挂在FAT usb 到 /mnt目录下,并且触发自定义的callout.
1. mcd.conf
[/dev/hd*t*]
Callout = PATH_MEDIA_PROCMGR #build in callout
Argument = /proc/mount #arg pass to callout
Priority = 11,10
Start Rule = MOUNT #file exist trigger MOUNT rule
Stop Rule = UNMOUNT #file disappear trigger UNMOUNT rule
[MOUNT]
Callout = MOUNT_FSYS #build in callout, read mnt file to do mount
Argument = /opt/mcd.mnt #arg pass to MOUNT_FSYS, the mnt file’s path
Match Rule = FILE_SCAN #if success, trigger FILE_SCAN rule
[UNMOUNT]
Callout = UNMOUNT_FSYS
[FILE_SCAN]
Callout = [email protected]_ext_lib.so #A extension callout
Argument = /mnt/usb_mnt
============================================================
2. mcd.mnt
/dev/hd0t12 /mnt/usb_mnt dos
============================================================
3. Build extension callout
Build a shared lib by this make cmd:
mcd_ext_lib:
$(CIT_QNX_QCC) -Vgcc_ntoarmv7 -EL -shared -c mcd_ext_lib.c
$(CIT_QNX_QCC) -Vgcc_ntoarmv7 -EL -shared -Wl -o mcd_ext_lib.so mcd_ext_lib.o
Write mcd_ext_lib.c by below content:
#include<stdio.h>
#include<sys/mcd.h> #Must include this head file
int my_func(char *device, void *arg)
{
printf("test! %s %s \n", device, arg);
return MCD_RULE_NO_MATCH;
}
==============================================================
在目标主机上运行: