linux網路程式設計十八 統一事件源

2021-06-21 11:22:27 字數 2296 閱讀 1227

訊號是一種非同步事件:訊號處理函式和程式的主迴圈是兩條不同的執行路線。

//統一事件源

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

int port = atoi(argv[1]);

int ret = 0;

int error;

struct sockaddr_in address;

bzero(&address, sizeof(address));

address.sin_family = af_inet;

address.sin_port = htons(port);

address.sin_addr.s_addr = htonl(inaddr_any);

int sockfd = socket(pf_inet, sock_stream, 0);

if (sockfd == -1)

return 1;

printf("server start...\n");

//設定位址可重用

int reuse = 1;

ret = setsockopt(sockfd, sol_socket, so_reuseaddr, &reuse, sizeof(reuse));

if (ret == -1)

printf("server reuseaddr success\n");

if ((bind(sockfd, (struct sockaddr*)&address, sizeof(address)) == -1) ||

(listen(sockfd, 5) == -1))

printf("server bind and listen success\n");

epoll_event events[max_event_number];

int epollfd = epoll_create(5);

if (epollfd == -1)

addfd(epollfd, sockfd);

//使用socketpair建立管道,註冊pipefd[0]上的可讀事件

ret = socketpair(pf_unix, sock_stream, 0, pipefd);

if (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++)

else if (listenfd == pipefd[0] && events[i].events & epollin)

case sighup:

case sigterm:

case sigint:

default:

break;}}

}}

else

} }

printf("close fds\n");

close(sockfd);

close(pipefd[1]);

close(pipefd[0]);

return 0;

}int setnonblocking(int fd)

void addfd(int epollfd, int fd)

void sig_handler(int sig)

void addsig(int sig)

參考:《linux高效能伺服器程式設計》

Linux 訊號 統一事件源

訊號是一中非同步事件 訊號處理函式和程式的主迴圈是兩條不同的執行路線。訊號處理函式需要盡可能快地執行完畢,以確保該信 號不會被遮蔽 訊號在處理期間,系統不會再觸發它 太久。一種典型的解決方案是 把訊號的主要處理邏輯放到程式的朱迴圈中,當訊號函式被觸發時,他只是簡單地通知主迴圈程式接收訊號,並把訊號值...

Linux訊號處理統一事件源

include include include include include include include include include include include include include include define max event number 1024 static in...

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

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