#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define max_event_number 1024
static int pipefd[2];
int setnonblocking( int fd )
void addfd( int epollfd, int fd )
//訊號處理函式
void sig_handler( int sig )
//設定訊號的處理函式
void addsig( int sig )
int main( int argc, char* argv )
const char* ip = argv[1];
int port = atoi( argv[2] );
int ret = 0;
struct sockaddr_in address;
bzero( &address, sizeof( address ) );
address.sin_family = af_inet;
inet_pton( af_inet, ip, &address.sin_addr );
address.sin_port = htons( port );
int listenfd = socket( pf_inet, sock_stream, 0 );
assert( listenfd >= 0 );
//int nreuseaddr = 1;
//setsockopt( listenfd, sol_socket, so_reuseaddr, &nreuseaddr, sizeof( nreuseaddr ) );
ret = bind( listenfd, ( struct sockaddr* )&address, sizeof( address ) );
if( ret == -1 )
//assert( ret != -1 );
ret = listen( listenfd, 5 );
assert( ret != -1 );
epoll_event events[ max_event_number ];
int epollfd = epoll_create( 5 );
assert( epollfd != -1 );
addfd( epollfd, listenfd );
//使用socketpair建立管道,註冊pipefd[0]上的可讀事件
ret = socketpair( pf_unix, sock_stream, 0, pipefd );
assert( ret != -1 );
setnonblocking( pipefd[1] );
addfd( epollfd, pipefd[0] );
//設定一些訊號的處理函式
addsig( sighup );
addsig( sigchld );
addsig( sigterm );
addsig( sigint );
bool stop_server = false;
while( !stop_server )
for ( int i = 0; i < number; i++ )
//如果就緒的檔案描述符是pipefd[0],則處理訊號
else if( ( sockfd == pipefd[0] ) && ( events[i].events & epollin ) )
else if( ret == 0 )
else
case sigterm:
case sigint:}}
}}
else}}
printf( "close fds\n" );
close( listenfd );
close( pipefd[1] );
close( pipefd[0] );
return 0;
}
Linux 訊號 統一事件源
訊號是一中非同步事件 訊號處理函式和程式的主迴圈是兩條不同的執行路線。訊號處理函式需要盡可能快地執行完畢,以確保該信 號不會被遮蔽 訊號在處理期間,系統不會再觸發它 太久。一種典型的解決方案是 把訊號的主要處理邏輯放到程式的朱迴圈中,當訊號函式被觸發時,他只是簡單地通知主迴圈程式接收訊號,並把訊號值...
linux網路程式設計十八 統一事件源
訊號是一種非同步事件 訊號處理函式和程式的主迴圈是兩條不同的執行路線。統一事件源 include include include include include include include include include include include include include inclu...
高效能伺服器程式設計之統一事件源
在伺服器程式設計框架中,都伴隨著配置初始化,日誌列印 訊號處理 連線處理,資料處理等步驟。訊號常常可以用來進行父子程序,執行緒的管控,但訊號與連線到來 資料到來走的是不同的執行路線,並且訊號處理函式要盡可能快地執行完,因為在訊號函式處理期間,該訊號不會被再次觸發。為了能統一管理這些事件,一種典型的統...