Linux訊號處理統一事件源

2021-07-02 17:20:44 字數 2080 閱讀 7323

#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...

高效能伺服器程式設計之統一事件源

在伺服器程式設計框架中,都伴隨著配置初始化,日誌列印 訊號處理 連線處理,資料處理等步驟。訊號常常可以用來進行父子程序,執行緒的管控,但訊號與連線到來 資料到來走的是不同的執行路線,並且訊號處理函式要盡可能快地執行完,因為在訊號函式處理期間,該訊號不會被再次觸發。為了能統一管理這些事件,一種典型的統...