2014-11-21 24 views
3

--- config.h中如何正確創建G-Wan全局變量?

extern char userurl[3]; 
char userurl[3]; 

--- index.c

include "config.h" 

int main(int argc, char *argv[]) { 
    char *req_g="",*req_p=""; 

    get_arg("g=", &req_g, argc,argv); 
    get_arg("p=", &req_p, argc,argv); 

    strcat(userurl,req_g); 
    strcat(userurl,req_p); 
    .. 

    xbuf_xcat(reply,"%s",userurl); 
    .. 

    return 200; 
} 

然後我用http://127.0.0.1:8080/?index&g=a&p=b

我重裝多次,結果重複:userurl不會釋放。 ..

什麼是正確的方式來申報externglobal變量gwan?

+0

易於使用:初始化您的變量。 'userurl [0] ='\ 0'' 此外,你的代碼容易發生緩衝區溢出攻擊(事實上userurl溢出),所以要注意這一點。 – Nagi 2014-11-22 00:26:06

回答

0

每個G-WAN腳本分別編譯。因此,所有變量都是static(本地模塊) - 如果不使用指針和原子操作,則不能共享它們。

爲了緩解使用全局變量,G-WAN提供持久性指針(US_HANDLER_DATAUS_VHOST_DATA,或US_REQUEST_DATA):

void *pVhost_persistent_ptr = (void*)get_env(argv, US_VHOST_DATA); 
if(pVhost_persistent_ptr) 
    printf("%.4s\n", pVhost_persistent_ptr); 

// get a pointer on a pointer (to CHANGE the pointer value) 
void **pVhost_persistent_ptr = (void*)get_env(argv, US_VHOST_DATA); 
if(pVhost_persistent_ptr) 
    *pVhost_persistent_ptr = strdup("persistent data"); 

幾個例子,如persistence.cstream3.c說明如何入手現實生活中的節目。

+0

在這種情況下不尋找跨多個實例調用的持久性。我正在尋找該特定實例的全局變量,並希望在每次運行後釋放實例的全局變量(gc) – stashfree 2014-11-22 21:43:50

+0

請定義*「instance」*。 G-WAN持久指針適用於單個G-WAN實例(但可能併發腳本通過多個線程運行)。如果你需要一個變量來保存請求或連接的時間,那麼使用** US_REQUEST_DATA **(並且用** gc_alloc()**)分配上下文。 – Gil 2014-11-23 13:45:58

+0

我不希望變量在請求或連接時間內存活。我希望它在客戶關閉連接時「被釋放」。 Nagi是否建議了正確的方法? – stashfree 2014-11-24 08:35:38