在Linux中,捕獲信號的方法有兩種:
void (*signal(int sig, void (*handler)(int)))(int);
其中,sig是要捕獲的信號的編號,handler是信號處理函數的指針。當信號發生時,系統會調用注冊的信號處理函數來處理該信號。
例如,以下代碼演示了如何捕獲并處理SIGINT信號:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigint_handler(int sig)
{
printf("Caught SIGINT signal\n");
// 這里可以進行信號處理的邏輯
}
int main()
{
signal(SIGINT, sigint_handler);
while (1) {
sleep(1);
}
return 0;
}
int sigaction(int sig, const struct sigaction *restrict act,
struct sigaction *restrict oact);
其中,sig是要捕獲的信號的編號,act是指向sigaction結構的指針,該結構包含信號處理函數的信息。
以下代碼演示了如何使用sigaction()函數捕獲并處理SIGINT信號:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigint_handler(int sig)
{
printf("Caught 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) {
sleep(1);
}
return 0;
}
無論是使用signal()函數還是sigaction()函數,捕獲的信號發生時,系統會調用注冊的信號處理函數來處理該信號。