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