赞
踩
在Linux操作系统中,SIGUSR1和SIGUSR2是用户定义的信号,它们可以由进程发送给另一个进程,或者由进程发送给自己,用于实现用户间的通信或执行特定的处理。这些信号可以被捕获、忽略或采取默认动作。
Linux系统共定义了64种信号,分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。
在终端,可通过
相比于非实时信号,实时信号有如下特点:
SIGUSR1(User-defined signal 1)
SIGUSR2(User-defined signal 1)
4. 与SIGUSR1类似,SIGUSR2也是一个实时信号,可以用于用户自定义目的。
5. 默认情况下,SIGUSR2的默认动作也是终止进程,但进程可以选择捕获这个信号并定义自己的处理函数。
6. 开发者可以根据需要使用SIGUSR2信号,例如,可以让进程在收到信号时切换到不同的运行模式或执行特定的维护任务。
信号集(signal set)是指一个能够包含多个信号的数据类型,它用于表示一组信号。信号集通常用于信号掩码(signal mask)和信号处理的相关操作中。进程可以使用信号集来指定它希望阻塞的信号(sigprocmask)、它希望等待的信号(sigwait或sigtimedwait),或者它想要处理的信号(sigpending)。
在Linux中,信号集通过sigset_t类型来表示,这是一个能够包含所有信号的数据类型。信号集相关的操作可以通过一组函数来进行,这些函数包括:
函数 | 作用 |
---|---|
sigemptyset | 初始化一个信号集,使其不包含任何信号。 |
sigfillset | 初始化一个信号集,使其包含所有信号。 |
sigaddset | 向信号集中添加一个特定的信号。 |
sigdelset | 从信号集中删除一个特定的信号。 |
sigismember | 检查一个信号是否是信号集的成员。 |
下面逐一讲解:
#include <stdio.h>
#include <signal.h>
int main() {
raise(SIGKILL);
//raise(SIGSTOP);
printf("process run ok\n");
return 0;
}
编译运行这一段程序,可见,程序还没打印字符串就结束了。可见这个函数可以用于程序自杀。
写个死循环的代码让他运行着,然后编译下面的函数,kill掉目标死循环进程。
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> int main(int argc, char *argv[]) { char *endptr = NULL; unsigned long int val; val = strtoul(argv[1], &endptr, 10); printf("val = %d \n",val); kill(val, SIGKILL); printf("Has kill\n"); return 0; }
这里之所以输入6564dfd是为了试验一下strtoul函数
使用 alarm 来定时 seconds 发送一个 SIGALRM 信号,该信号的默认动作是终止进程:
函数格式:
unsigned int alarm(unsigned int seconds);
这个闹钟函数还挺有意思,下次专门写个博客描述一下。
处理信号一般分三类:忽略,默认处理、自定义处理。
如果设置为自定义处理,要保证信号处理函数为可重入函数。何为可重入函数???
可重入函数就是可以被中断的函数,不可重入的函数会由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断,返回可能会出现问题。在信号处理函数中还要做到:
1、不要使用带有全局静态数据结构的函数
2、不要调用 malloc 和 free
3、不要调用标准 IO 函数
参考:read://https_dlonng.com/?url=https%3A%2F%2Fdlonng.com%2Fposts%2Fsignal
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。