在Linux中,處理SIGINT信號(即按下Ctrl+C時發送的信號)的技巧有以下幾種:
使用signal()函數注冊信號處理函數:可以使用signal()函數將自定義的信號處理函數注冊到SIGINT信號上。當接收到SIGINT信號時,系統會調用該信號處理函數。例如:
#include <stdio.h>
#include <signal.h>
void sigint_handler(int sig) {
printf("Received SIGINT signal\n");
}
int main() {
signal(SIGINT, sigint_handler);
while (1) {
// 無限循環
}
return 0;
}
使用sigaction()函數注冊信號處理函數:與signal()函數相比,sigaction()函數提供了更多的控制選項,可以更靈活地處理信號。例如:
#include <stdio.h>
#include <signal.h>
void sigint_handler(int sig) {
printf("Received SIGINT signal\n");
}
int main() {
struct sigaction sa;
sa.sa_handler = sigint_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
while (1) {
// 無限循環
}
return 0;
}
使用sigprocmask()函數阻塞/解除阻塞信號:可以使用sigprocmask()函數設置信號掩碼,阻塞或解除阻塞指定的信號。在處理SIGINT信號時,可以在信號處理函數中使用sigprocmask()函數來屏蔽其他信號,以保證信號處理的穩定性。例如:
#include <stdio.h>
#include <signal.h>
void sigint_handler(int sig) {
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigprocmask(SIG_BLOCK, &mask, NULL);
printf("Received SIGINT signal\n");
sigprocmask(SIG_UNBLOCK, &mask, NULL);
}
int main() {
signal(SIGINT, sigint_handler);
while (1) {
// 無限循環
}
return 0;
}
這些技巧可以幫助程序員更好地處理SIGINT信號,確保程序在接收到SIGINT信號時能夠正確地進行處理。