C库 - signal() 函数



C库的signal()函数允许用户在程序执行期间处理异步事件。异步事件是指报告程序外部事件的软件通知。例如:除以零、键盘中断等。这里,void(*signal(int sig, void (*func)(int))) (int) 设置一个函数来处理信号,即使用信号编号sig的信号处理程序。

语法

以下是C库signal()函数的语法:

void (*signal(int sig, void (*func)(int)))(int)

参数

  • sig - sig定义了构建处理函数的信号。以下是重要的标准信号编号列表:

序号 宏 & 信号
1

SIGABRT

(信号中止)异常终止,例如由函数启动。

2

SIGFPE

(信号浮点异常)错误的算术运算,例如零除或导致溢出的运算(不一定与浮点运算有关)。

3

SIGILL

(信号非法指令)无效函数映像,例如非法指令。这通常是由于代码损坏或尝试执行数据造成的。

4

SIGINT

(信号中断)交互式注意信号。通常由应用程序用户生成。

5

SIGSEGV

(信号段错误)无效的存储器访问 - 当程序尝试读取或写入其分配的内存之外的内存时。

6

SIGTERM

(信号终止)发送到程序的终止请求。

  • func - 这是一个指向函数的指针。这可以是程序员定义的函数,也可以是以下预定义函数之一:

序号 函数 & 描述
1

SIG_DFL

默认处理 - 信号由该特定信号的默认操作处理。

2

SIG_IGN

忽略信号 - 信号被忽略。

返回值

此函数返回信号处理程序的先前值,或在出错时返回SIG_ERR。

示例1

以下是一个基本的C库程序,用于演示signal()函数。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sighandler(int);

int main () {
   signal(SIGINT, sighandler);

   while(1) {
      printf("Going to sleep for a second...\n");
      sleep(1); 
   }
   return(0);
}

void sighandler(int signum) {
   printf("Caught signal %d, coming out...\n", signum);
   exit(1);
}

输出

执行上述代码后,我们将产生以下结果,程序将进入无限循环。要退出程序,我们使用CTRL + C键。

Going to sleep for a second...
Going to sleep for a second...
Going to sleep for a second...
Going to sleep for a second...
Going to sleep for a second...
Caught signal 2, coming out...

示例2

在这个例子中,我们说明了忽略SIGINT信号。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handle_sigint(int signum) {
    printf("Received Ctrl+C, but ignoring it.\n");
}

int main() {
   // Press Ctrl+C to ignore (SIGINT)
   signal(SIGINT, SIG_IGN); 
   while (1) {
       printf("Press Ctrl+C (ignored)...\n");
       sleep(1);
    }
   return 0;
}

输出

上述代码产生以下结果,程序将进入无限循环。要退出程序,请使用 CTRL + C 键。

Press Ctrl+C (ignored)...
Press Ctrl+C (ignored)...
Press Ctrl+C (ignored)...
Press Ctrl+C (ignored)...
^CPress Ctrl+C (ignored)...

示例3

在这个例子中,我们使用信号SIGTERM来请求程序终止。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void sig_handler(int signum) {
   printf("Received SIGTERM. Exiting gracefully...\n");
   // Perform cleanup or other necessary actions before exiting
   _exit(0);
}

int main() {
   // Set custom signal handler for SIGTERM
   signal(SIGTERM, sig_handler); 
   while (1) {
       printf("Press Ctrl+C to send SIGTERM...\n");
       sleep(1);
    }
   return 0;
}

输出

执行代码后,我们得到以下结果:

Press Ctrl+C to send SIGTERM...
Press Ctrl+C to send SIGTERM...
Press Ctrl+C to send SIGTERM...
Press Ctrl+C to send SIGTERM...
^C

Advertisements