發表文章

目前顯示的是 五月, 2015的文章

popen 程式範例

最近公司有個案子在做 WiFi 管理系統,透過集中式的控制器(AC,Access Controller)來管理轄下的 AP(Access Points,CAPWAP 的用語是 WTP)。嗯,有些 sense 的人應該就會知道說:「啊,你在做 CAPWAP」,Bingo!不過這篇沒打算要介紹 CAPWAP,下次有機會來講講 CAPWAP 的故事(不是技術,因為技術的部份我覺得很無聊,所以來講講故事和我的一些心得)。在做的時候遇到一個問題,廠商提供的平台,但卻沒提供人來進行系統整合。簡單來說,就是版子往我桌上一扔,就說:「給我在上面做這個功能」,然後時間短的不像話。額外抱怨一下,他選的 AC 平台比 raspberry pi 的效能還差,居然還敢跟我開口要一堆功能 ... 。理論上來說,AC 會把 WTP 的相關資訊帶到各 WTP,然後這時候 WTP 的 capwap daemon 會對核心層的 driver 進行設定。

一般說來,這種設定的方式是透過 ioctl 的溝通管道,最常見的範例程式就是 ifconfig,透過上下層定義好的 SIOCSIFFLAGS(Socket I/O Control Set Interface Flags)來進行溝通,所以一般來說這是屬於系統平台人員所要處理的問題。可是對於那種把版子跟一堆文件丟在我桌上,又不給我足夠時間的傢伙,我才懶得幫他查 WiFi driver 上需要的 SIOCSFFLAGS 勒。但案子又要進行,那要怎麼辦呢?所以我決定採取最單純的作法:直接呼叫系統的 WiFi 控制指令,如 iwpriv、wlanconfig 等,透過這些指令直接呼叫來取得並設定相關參數。缺點很明顯,就是效能會比較差,但一來是差不了多少(在意效能就給我拿比較像話的版子來!),二來是我相信對方提供的這些指令應該是測試過了,代表系統應該已經整合完畢了(我覺得是我一廂情願,但起碼對方無法還口,要合作也拿點誠意來吧)。

下一個問題是,要怎麼執行系統指令?最直覺的作法,用 system 的函式,問題是我要怎麼撈回傳的資料呢?因此這篇文章就來紀錄另外一支系統函式:popen 的用法。先來看看 man 的說明吧。

The  popen()  function  opens  a  process by creating a pipe, forking, an…