www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]關于State Threads的介紹可以參考:談談并發(fā)編程中的協(xié)程網(wǎng)絡架構庫:State ThreadsState Threads:回調終結者一.源碼編譯下面是在Fedora 20(裝在了虛擬機中)上

關于State Threads的介紹可以參考:
談談并發(fā)編程中的協(xié)程
網(wǎng)絡架構庫:State Threads
State Threads:回調終結者
一.源碼編譯
下面是在Fedora 20(裝在了虛擬機中)上的實操記錄:
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

此時會提示“Please specify one of the following targets”,如下圖所示:


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

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

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