[QNX] 用mcd實現存儲設備自動掛在

Ref DOC : QNX_Neutrino_RTOS_Utilities_Reference.pdf

注:MCD 工具只在6.6之前的版本可以使用,7.0上已經將它的功能整合給了其他工具

 

mcd 簡介

mcd是可以用來檢測某個設備或者某個文件是否存在的工具,並且可以根據檢測結果做出相應的反應,比如,如果某個Upluged,那麼/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;

}

==============================================================

 

在目標主機上運行:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章