注意!!!信号不是信号量
信号:概念,信号的生命周期,函数的重入与不可重入,关键字volatile
- 掌握Linux信号的基本概念
- 掌握信号产生的一般方式
- 理解信号递达和阻塞的概念,原理。
- 掌握信号捕捉的一般方式。
- 重新了解可重入函数的概念。
是一种事件通知机制,通知进程发生了某个事件,打断进程当前的操作然后去处理这个事件。
kill -l 查看linux中的信号种类—62种(中间没有32/33)
非可靠信号/非实时信号: 1~31;(是从unix系统借鉴来的)
可靠信号/实时信号: 34~64;(linux新增加的)
信号的产生, 信号的注册,信号的注销,信号的处理+ 阻塞
(1)kill -signum pid命令(kill杀死一个进程的原理就是给进程发送一个能够让进程退出的信号。)kill默认是15号信号。
(2)int kill(pid_ t pid, int sig);给指定进程发送指定信号
(3)int raise(int sig);给自己发送指定的信号.
(4)void abort(void);给自己发送SIGABRT信号
(5)unsigned int alarm(unsigned int s);s秒后发送SIGALRM给自己
通过命令:vi /usr/include/bits/signum.h 打开signum.h文件查看信号


这里插一条查找命令:当我们知道文件名字以及大致在哪个目录下时候输入命令:grep -R ‘SIGKILL’ /usr/include 回车查找。即可查找到正确目录~
(1)ctrl+c:中断当前操作。本质是给当前进程发送一个2号中断信号Interrupt(ANSI)
(2)ctrl+\ :本质给进程发送3号退出信号Quit(POSIX)
(3)ctrl+z:发送的是20号信号 Keyboard stop (POSIX)
让进程知道自己收到了某个信号/事件需要去处理
在进程中做标记;
在pcb中有个未决信号集合(位图) ,用于标记进程信号。
信号的注销:删除待处理的未决信号(pending位图中)的信息。
一个是位图,还有一个是链表
位图:主要是为了标记是否收到了某个信号
链表:统计收到多少个相同信号
信号的处理就是完成一个事件的处理,一个事件的处理其实就是一个功能的完成,一个功能的最小模块就是一个函数,信号处理说白了就是**运行信号的处理函数(**每个信号处理函数是不一样的)。信号的处理函数(处理方式)是可以修改的。

一个用户进程无法直接访问内核空间,只能通过系统调用进行访问,当程序通过系统调用访问内核空间的过程称之为运行在内核态。
程序运行从用户态切换到内核态:系统调用接口,异常,中断
int sigprocmask(int how,sigset_t * new,sigset_t * old);
思路:
1.先修改指定信号的处理方式 signal(sig, handler)
2.阻塞指定的/所有信号 sigprocmask(SIG_ BLOCK)
3.等待用户按下回车 getchar()
4.解除阻塞 sigprocmask(SIG_ UNBLOCK)
sigset_ t new;
会用到的辅助接口:
sigemptyset(sigset_ t *set); 清空
sigaddset(sigset_ t *set, int sig); 添加指定信号到集合
sigillset(sigset_ t *set);添加所有信号到集合中
sigdelset(sigset_ t *set, int sig);从集合中移除指定信号
sigismember(sigset t *set, int sig)判断信号是否在集合中
代码:
vi mask.c
1 #include 2 #include 3 #include 4 #include 5 6 void sigcb(int signo) 7 { 8 printf("recv signo:%d\n", signo); 9 } 10 int main() 11 { 12 signal(SIGINT, sigcb);//修改信号处理方式 13 signal(40, sigcb); 14 15 sigset_t set;//定义信号集合 16 sigemptyset(&set);//将集合清空 17 //sigaddset(&set, SIGINT);//将SIGINT信号添加到集合中 18 //sigaddset(&set, 40); 19 sigfillset(&set);//将所有信号添加到set集合中 20 //将set集合中的信号添加到block集合中进行阻塞 21 sigprocmask(SIG_BLOCK, &set, NULL); 22 23 printf("输入回车继续运行...\n"); 24 getchar();//等待一个回车,没有回车就一直卡在这里 25 26 sigprocmask(SIG_UNBLOCK, &set, NULL);//解除阻塞,观察信号处理 27 28 return 0; 29 } makefile 内容
在这里插入代码片 make一下
在进程中,有两个信号是不可被阻塞,不可被修改处理方式的: SIGKILL SIGSTOP
一个进程kill杀不死原因是什么?1.僵尸进程; 2.信号被修改处理方式;3.信号被阻塞
上一篇:假新闻检测论文分享(27)Adapting Fake News Detection to the Era of Large Language Models
下一篇:注意看,软件外包需要注意什么?