一、方法分析在Linux環境下gethostbyname函式是用來向DNS查詢一個域名的IP地址。 由於DNS的查詢方式是遞迴查詢,在網路不通的情況下會導致gethostbyname函式在查詢一個域名時出現嚴重超時問題。而該函式又不能像connect和read等函式那樣透過setsockopt或者select函式那樣設定超時時間,因此常常成為程式開發的瓶頸。在多執行緒環境下,gethostbyname會出現一個非常嚴重的問題,就是如果有一個執行緒的gethostbyname發生阻塞,其它執行緒都會在gethostbyname處發生阻塞,直到該執行緒的gethostbyname函式返回為止。針對這樣的問題我們應該怎麼處理呢?下面介紹兩種方法:1、 使用alarm設定訊號,如果超時就用sigsetjmp和siglongjmp跳過gethostbyname函式。2、 獨立開啟一個執行緒來呼叫gethostbyname函式,該執行緒除了呼叫此函式外,不做任何事情。二、方法介紹1、alarm設定訊號方法(1)、sigsetjmp和siglongjmp概述sigsetjmp: 引數為非0的時候,會儲存程序的當前訊號遮蔽字siglongjmp: 恢復儲存的訊號遮蔽字(2)、使用方法#include
一、方法分析在Linux環境下gethostbyname函式是用來向DNS查詢一個域名的IP地址。 由於DNS的查詢方式是遞迴查詢,在網路不通的情況下會導致gethostbyname函式在查詢一個域名時出現嚴重超時問題。而該函式又不能像connect和read等函式那樣透過setsockopt或者select函式那樣設定超時時間,因此常常成為程式開發的瓶頸。在多執行緒環境下,gethostbyname會出現一個非常嚴重的問題,就是如果有一個執行緒的gethostbyname發生阻塞,其它執行緒都會在gethostbyname處發生阻塞,直到該執行緒的gethostbyname函式返回為止。針對這樣的問題我們應該怎麼處理呢?下面介紹兩種方法:1、 使用alarm設定訊號,如果超時就用sigsetjmp和siglongjmp跳過gethostbyname函式。2、 獨立開啟一個執行緒來呼叫gethostbyname函式,該執行緒除了呼叫此函式外,不做任何事情。二、方法介紹1、alarm設定訊號方法(1)、sigsetjmp和siglongjmp概述sigsetjmp: 引數為非0的時候,會儲存程序的當前訊號遮蔽字siglongjmp: 恢復儲存的訊號遮蔽字(2)、使用方法#include