信号是操作系统用来处理程序运行过程中发生的事件的一种机制,在C语言中,我们可以使用signal函数来处理这些信号,signal函数用于设置信号处理函数,当接收到指定的信号时,会自动调用该信号处理函数,本文将详细介绍C语言signal函数的使用方法。
1、signal函数原型
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
signal函数有两个参数,第一个参数signum表示要处理的信号,第二个参数handler表示信号处理函数,signal函数返回值是之前与signum关联的信号处理函数的指针,如果出错,返回SIG_ERR。
2、信号处理函数
信号处理函数是一个特殊的函数,它没有参数,也没有返回值,当接收到指定的信号时,操作系统会自动调用这个函数,我们可以通过定义一个函数来实现信号处理,然后将这个函数的地址传递给signal函数。
#include <stdio.h> #include <signal.h> #include <unistd.h> void signal_handler(int signum) { printf("接收到信号 %d ", signum); } int main() { if (signal(SIGINT, signal_handler) == SIG_ERR) { perror("signal"); return 1; } while (1) { pause(); // 暂停进程,等待信号 } return 0; }
在这个例子中,我们定义了一个名为signal_handler的信号处理函数,当接收到SIGINT信号(通常是用户按下Ctrl+C)时,会打印一条消息,我们将这个函数的地址传递给signal函数,将其设置为SIGINT信号的处理函数,我们使用pause函数暂停进程,等待信号的到来。
3、使用signal函数设置多个信号处理函数
我们可以使用signal函数为同一个信号设置多个处理函数,当接收到指定的信号时,会按照信号处理函数的优先级顺序依次调用它们,默认情况下,系统会先调用注册的第一个信号处理函数,然后是第二个、第三个……如果某个信号处理函数返回了,那么后面的信号处理函数就不会再被调用了。
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void signal_handler1(int signum) { printf("信号处理函数1:接收到信号 %d ", signum); } void signal_handler2(int signum) { printf("信号处理函数2:接收到信号 %d ", signum); } void signal_handler3(int signum) { printf("信号处理函数3:接收到信号 %d ", signum); } int main() { if (signal(SIGINT, signal_handler1) == SIG_ERR) { perror("signal"); return 1; } if (signal(SIGINT, signal_handler2) == SIG_ERR) { perror("signal"); return 1; } if (signal(SIGINT, signal_handler3) == SIG_ERR) { perror("signal"); return 1; } while (1) { pause(); // 暂停进程,等待信号 } return 0; }
在这个例子中,我们为SIGINT信号设置了三个处理函数:signal_handler1、signal_handler2和signal_handler3,当接收到SIGINT信号时,会依次调用这三个处理函数,注意,由于我们在main函数中使用了三次signal函数,因此需要检查每次调用的结果是否为SIG_ERR,如果某个调用失败,应该立即返回错误。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/425738.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复