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 = my_func@my_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 = my_func@mcd_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;
}
==============================================================
在目標主機上運行: