當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]關(guān)于State Threads的介紹可以參考:談?wù)劜l(fā)編程中的協(xié)程網(wǎng)絡(luò)架構(gòu)庫(kù):State ThreadsState Threads:回調(diào)終結(jié)者一.源碼編譯下面是在Fedora 20(裝在了虛擬機(jī)中)上

關(guān)于State Threads的介紹可以參考:
談?wù)劜l(fā)編程中的協(xié)程
網(wǎng)絡(luò)架構(gòu)庫(kù):State Threads
State Threads:回調(diào)終結(jié)者
一.源碼編譯
下面是在Fedora 20(裝在了虛擬機(jī)中)上的實(shí)操記錄:
1.從官網(wǎng)http://sourceforge.net/projects/state-threads下載源碼包,最新版是1.9
2.下載完st-1.9.tar.gz,然后解壓
tar zxvf st-1.9.tar.gz
cd st-1.9
make

此時(shí)會(huì)提示“Please specify one of the following targets”,如下圖所示:


我選擇的是linux-debug。
make linux-debug
此時(shí)會(huì)在目錄st-1.9中產(chǎn)生一個(gè)新的目錄LINUX_3.11.10-301.fc20.i686_DBG,里面有生成的中間文件*.o, 頭文件st.h,libst.so,libst.a和example中的三個(gè)例子:lookupdns,proxy,server。
需要注意的是st.h是動(dòng)態(tài)生成的,這種方法值得學(xué)習(xí)。
二.doc目錄研究
在st-1.9源碼中doc目錄有幾個(gè)文檔,可以參考:
st.html——ST庫(kù)概論,翻譯在網(wǎng)絡(luò)架構(gòu)庫(kù):State Threads
timeout_heap.txt——超時(shí)heap實(shí)現(xiàn)
notes.html——給出了編程注意點(diǎn),包括移植,信號(hào),進(jìn)程內(nèi)同步,進(jìn)程間同步,非網(wǎng)絡(luò)IO,超時(shí)處理,特別談到進(jìn)程內(nèi)同步非常簡(jiǎn)單,不需要同步資源;非網(wǎng)絡(luò)IO中談到drawback和設(shè)計(jì)時(shí)需要避免的方法
reference.html——一個(gè)API接口文檔介紹,需要認(rèn)真閱讀和熟悉,但是需要編碼實(shí)戰(zhàn)來(lái)加深理解
對(duì)于reference.html,最重要的是文尾的Program Structure部分,它給出了在一個(gè)網(wǎng)絡(luò)應(yīng)用程序中使用ST庫(kù)的基本步驟:
1.如果需要,使用下面的pre-init(預(yù)初始化)函數(shù)配置ST庫(kù),設(shè)置時(shí)間,事件通知機(jī)制
st_set_utime_function()
st_set_eventsys()
2.調(diào)用初始化函數(shù)st_init()來(lái)初始化ST庫(kù)
3.如果需要,調(diào)用post-init(后初始化)函數(shù)來(lái)配置ST庫(kù),設(shè)置timecache,隨機(jī)化線程棧,進(jìn)程resume和stop的回調(diào)函數(shù)
st_timecache_set()
st_randomize_stacks()
st_set_switch_in_cb()
st_set_switch_out_cb()
4.生成不同process之間共享的資源,創(chuàng)建并綁定socket,監(jiān)聽socket,生成共享內(nèi)存段,IPC(進(jìn)程內(nèi)通信)channel和同步原語(yǔ)。
st_netfd_open_socket()
st_netfd_serialize_accept()
5.通過(guò)fork()創(chuàng)建多進(jìn)程, 父進(jìn)程退出或是watchdog
6.在每個(gè)子進(jìn)程中創(chuàng)建thread pool來(lái)處理user connection,線程池中的每個(gè)線程可以接受客戶端連接,也可以連接到其他服務(wù)器,或者執(zhí)行各種network I/O等等
st_thread_create()
st_accept()
st_connect()
st_read()
st_write()
注意:在使用ST庫(kù)時(shí),只有ST庫(kù)的I/O函數(shù)可以用于network I/O,其他的I/O調(diào)用(比如說(shuō)fread,fwrite)都可能阻塞調(diào)用進(jìn)程。
三.example目錄
? ? ? ?首先閱讀里面的README,它簡(jiǎn)單介紹了這三個(gè)例子的基本情況和用法
server包含server.c和error.c
lookupdns包含lookupdns.c和res.c
proxy包含proxy.c
? ? ? ?這里分析server的實(shí)現(xiàn)。server接受一個(gè)客戶端連接,接收客戶端數(shù)據(jù)并返給客戶端一個(gè)簡(jiǎn)單的HTML網(wǎng)頁(yè)(我會(huì)做適當(dāng)修改,讓server將接收到的內(nèi)容原樣返回)。以server為基礎(chǔ),我們可以很方便的實(shí)現(xiàn)其他的服務(wù)器。

? ? ?我將源碼server.c中的void handle_session(long srv_socket_index, st_netfd_t cli_nfd)函數(shù)改成如下形式,這樣server會(huì)將接收到的內(nèi)容原樣返回,方便測(cè)試多個(gè)客戶端的鏈接。

void handle_session(long srv_socket_index, st_netfd_t cli_nfd)
{
  char buf[512]={'