Linux进程信号(个人笔记)-2. 信号的产生

时间:2024-10-20 13:16:14

进程在运行的时候,前台(命令行操作的时候,只能有一个),后台(./XXX &)(可以有多个)
而检测是否是前台进程的标准:是看看你有没有能力接受用户输入(就是在运行程序时在shell上输入指令)
ctrl+c:终止前台进程
前台进程不能被暂停(ctrl+z),如果被暂停,该前台进程必须立即被放到后台

有关前台和后台进程切换的指令:

./XXXX &  #这个是将程序放到后台进行运行
jobs      #用于显示当前用户的所有作业(jobs)状态
fg number #用于将后台作业带回到前台
ctrl+z    #前台进程不能被暂停(ctrl+z),如果被暂停,该前台进程必须立即被放到后台
bg number #用于将一个被暂停的作业放到后台继续运行

信号在合适的时候处理:
1.默认行为
2.忽略
3.自定义—信号的捕捉

拓展:OS怎么知道键盘有数据输入了?中断
在这里插入图片描述
硬件:键盘
键盘硬件:键盘是输入设备,当你按下一个键时,内部电路会产生电信号。

中断请求
中断请求(IRQ):当你按下键盘的某个键时,键盘生成一个中断请求信号(IRQ)并发送给CPU,通知它有输入数据需要处理。这个信号会打断CPU当前正在执行的任务。

CPU的作用
中断处理:当CPU接收到中断请求后,它会完成当前的指令执行,然后保存当前任务的状态(如寄存器的内容、程序计数器等),以便在处理完中断后可以恢复继续执行。
查找中断向量:CPU使用中断向量表来确定处理该中断的具体中断处理程序的地址。中断向量表是一个在内存中存储的表格,它为每种可能的中断提供了一个处理程序的入口点。

中断向量表
中断向量表:内有函数指针数组,而函数指针数组中有特定硬件的读取方法(键盘的读取方法等)

信号产生的四种方式:

2.1 通过键盘进行信号产生

在这里插入图片描述
普通信号是1 ~ 31号信号,实时信号34 ~ 64号信号
每个进程对于信号会有函数指针数组和信号位图,函数指针数组的数组下标与信号编号强相关,信号位图就可以存储信号的相关信息,位图中比特位的位置,决定信号编号,比特位的内容决定是否收到信号,而发送信号的本质其实是OS向目标进程写信号,也就是说修改位图中对应信号的比特位。

Core Dump
一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁盘上,文件名通常是core,这叫做Core Dump
在这里插入图片描述

2.2 通过系统调用,指令来发送信号

kill(processpid,signumber);
int raise(int sig);//raise函数用于向当前进程发送信号,通常用于在程序中主动生成信号,以响应特定的条件或事件
abort()//生成SIGABRT信号并终止进程

2.3 进程异常

int a=10;
a/=0;

在这里插入图片描述
在这里插入图片描述
硬件MMU的作用:将虚拟地址转换为物理地址

2.4 软件条件

闹钟是一种软件条件

void handler(int signo)
{
  alarm(2);
  // n=alarm(0);
  cout << "result: " << n << endl;
  // std::cout<<"get a signo: "<<signo<<"alarm : "<<cnt<<std::endl;
  // exit(0);
}

int main()
{
  signal(14, handler);
  cout << "pid: " << getpid() << endl;
  alarm(2);
  while (true)
  {
    // cnt++;
    sleep(1);
    cout << "running ..." << endl;
  }
}

操作系统中的时间:
1.所有用户的行为,都是以进程的形式在OS中表现的。
2.操作系统只要把进程调度好,就能完成所有的用户任务。
3.CMOS,周期性,高频率的,向CPU发送时钟中断。

操作系统本质上就是一个死循环,硬件CMOS刺激CPU执行中断向量表中的调度方法,所以操作系统的执行其实是基于硬件中断的
在这里插入图片描述