- C标准库
- C库 - 首页
- C库 - <assert.h>
- C库 - <complex.h>
- C库 - <ctype.h>
- C库 - <errno.h>
- C库 - <fenv.h>
- C库 - <float.h>
- C库 - <inttypes.h>
- C库 - <iso646.h>
- C库 - <limits.h>
- C库 - <locale.h>
- C库 - <math.h>
- C库 - <setjmp.h>
- C库 - <signal.h>
- C库 - <stdalign.h>
- C库 - <stdarg.h>
- C库 - <stdbool.h>
- C库 - <stddef.h>
- C库 - <stdio.h>
- C库 - <stdlib.h>
- C库 - <string.h>
- C库 - <tgmath.h>
- C库 - <time.h>
- C库 - <wctype.h>
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... ^CAdvertisements