最近因為工作關係 , 需要使用一個 IPC (一對多 ) 的方式來控制 , 並且 server 需要有 blocking 的動作 (等待 server 發訊息在開始動作 ) , 本人又不想使用 sock (傳說中比較耗支援 ) .
比對並且找了一下後發現 Message queue 比較適合 .
msgrcv(); 如果不要加上IPC_NOWAIT , 就可以達到 blocking 的動作, 這樣就不會佔用太多CPU Resource .
msgrcv(); 也有一個參數 msgtype , 這個參數會對 queue 上的 masg 進行篩選 (type 相同才會接收) , 這個也可以達成一對多的訊息傳遞.
PS. msgtype = 0 , 所有訊息都收 , msgtype = xx , 只接收 type 為 xx 的message, msgtype = - yy , 接收 type 低於 yy 的訊息 (msgtype 是一個 long 的變數,所以都是數值, 這個數值不能是負數 ) .
使用上其實很簡單 , 大致份為 四個操作 function .
A. msgget()
建立或取得 message queue.
B. msgsend()
傳訊息資料到 message queue.
C. msgrcv()
從 message queue 取得訊息資料.
D. msgctl() with IPC_RMID.
最後不用 message queue 的時候, 將 這個 message queue 刪除 (distore).
不多說, 來幾個 example code 吧 !
A.msgget()
給個特別(識別)的 key .
msgflg 帶入 權限或是 IPC_CREAT (如果不存在就建立).
最傳回 handle id .
msgflg = IPC_CREAT | 0666;
m_msq_id = msgget((key_t)MSQ_CMD_KEYID, msgflg);
B. msgsnd()
我的使用上是對多個 server 進行播送 , 所以使用的 IPC_NOWAIT.
其中 data內的 mtype 需要設定這個 message 的type,如上面所敘述就可以讓
msgrcv 依照type 接收.
retval = msgsnd(m_msq_id, data, sizeof(struct msgbuf), IPC_NOWAIT);
C. msgrcv()
這邊需要注意type 參數,就如同上面敘述,可以 0 , xx or -yy .
最後一個 參數是 flag , 可以有 IPC_NOWAIT 等.
我需要 blocking , 所以帶 "0" .
rcv_siz = msgrcv(m_msq_id,data,sizeof(struct msgbuf),type,0);
D. msgctl()
這個有很多控制參數可以用, 不過我只使用最後 distore 的功能.
範例如下:
retval = msgctl(m_msq_id, IPC_RMID, (struct msqid_ds *)NULL);
Reference:
下列這個網頁有詳細的說明和一些 example code .
http://www.cs.cf.ac.uk/Dave/C/node25.html
2014年5月26日 星期一
2014年5月21日 星期三
Booting time.
最近在最佳化系統工作 , 主要 force on booting time .
後來發現 , 第一個程式 loading 完到執行 main() 卻要花很久 .
實驗範例如下 :
int main(int argc, char **argv)
{
.......
printf ("xxxxx \n );
.........
.........
}
發現 printf 大約要 2 秒後才會列印出來 , Why ?? 花很多時間在 loading library 嗎 ?
(當然我的 cpu 只有 133MHz , 所以才會花這樣久 , 如何測量呢 ? 可以利用 bootchart 搭配來測量 , 雖說不是很準, 不過可以看到有所 delay time )
結果發現 ,只要在 .so file 的 code 內加入下列這樣的宣告 Function .
就會在 loading .so 的時候去執行 ,如果這樣的 function 花費很多時間處理 , 當然 running main() 的時間也會延後 .
__attribute__ ((constructor)) void test_font_init(void)
{
..........
}
PS. 主要是宣告 constructor這個屬性 , 有關這個 屬性的詳細內容 , 使用方式 ,可以去 google 找一下,一堆說明 .
後來發現 , 第一個程式 loading 完到執行 main() 卻要花很久 .
實驗範例如下 :
int main(int argc, char **argv)
{
.......
printf ("xxxxx \n );
.........
.........
}
發現 printf 大約要 2 秒後才會列印出來 , Why ?? 花很多時間在 loading library 嗎 ?
(當然我的 cpu 只有 133MHz , 所以才會花這樣久 , 如何測量呢 ? 可以利用 bootchart 搭配來測量 , 雖說不是很準, 不過可以看到有所 delay time )
結果發現 ,只要在 .so file 的 code 內加入下列這樣的宣告 Function .
就會在 loading .so 的時候去執行 ,如果這樣的 function 花費很多時間處理 , 當然 running main() 的時間也會延後 .
__attribute__ ((constructor)) void test_font_init(void)
{
..........
}
PS. 主要是宣告 constructor這個屬性 , 有關這個 屬性的詳細內容 , 使用方式 ,可以去 google 找一下,一堆說明 .
訂閱:
文章 (Atom)