Linux几种中断信号的区别:HUP,INT,KILL,TERM,TSTP

Linux几种中断信号的区别:HUP,INT,KILL,TERM,TSTP,第1张

Linux的HUP,INT,KILL,TERM,TSTP中断信号区别为:键入不同、对应 *** 作不同、启用不同。

一、键入不同

1、HUP中断信号:HUP中断信号是当用户键入<Ctrl+X>时由终端驱动程序发送的信号。

2、INT中断信号:INT中断信号是当用户键入<Ctrl+I>时由终端驱动程序发送的信号。

3、KILL中断信号:KILL中断信号是当用户键入<Ctrl+Z>时由终端驱动程序发送的信号。

4、TERM中断信号:TERM中断信号是当用户键入<Ctrl+ \>时由终端驱动程序发送的信号。

5、TSTP中断信号:TSTP中断信号是当用户键入<Ctrl+T>时由终端驱动程序发送的信号。二、对应 *** 作不同

1、HUP中断信号:HUP中断信号的对应 *** 作为让进程挂起,睡眠。

2、INT中断信号:INT中断信号的对应 *** 作为正常关闭所有进程。

3、KILL中断信号:KILL中断信号的对应 *** 作为强制关闭所有进程。

4、TERM中断信号:TERM中断信号的对应 *** 作为正常的退出进程。

5、TSTP中断信号:TSTP中断信号的对应 *** 作为暂时停用进程。

三、启用不同

1、HUP中断信号:HUP中断信号发送后,可以重新被用户再次输入恢复启用进程。

2、INT中断信号:INT中断信号发送后,不可以重新被用户再次输入恢复启用进程。

3、KILL中断信号:KILL中断信号发送后,不可以重新被用户再次输入恢复启用进程。

4、TERM中断信号:TERM中断信号发送后,可以重新被用户再次输入启用进程。

5、TSTP中断信号:TSTP中断信号发送后,可以重新被用户再次输入继续使用进程。

#include

#include

#include

#include

#include

#include

#define BAUDRATE B38400

#define MODEMDEVICE "/dev/ttyS1"

#define _POSIX_SOURCE 1 /* POSIX 系统相容 */

#define FALSE 0

#define TRUE 1

volatile int STOP=FALSE

void signal_handler_IO (int status) /* 定义讯号处理程序 */

int wait_flag=TRUE /* 没收到讯号的话就会是 TRUE */

main()

{

int fd,c, res

struct termios oldtio,newtio

struct sigaction saio /* definition of signal action */

char buf[255]

/* 开启装置为 non-blocking (读取功能会马上结束返回) */

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK)

if (fd <0) {perror(MODEMDEVICE)exit(-1)}

/* 在使装置非同步化前, 安装讯号处理程序 */

saio.sa_handler = signal_handler_IO

saio.sa_mask = 0

saio.sa_flags = 0

saio.sa_restorer = NULL

sigaction(SIGIO,&saio,NULL)

/* 允许行程去接收 SIGIO 讯号*/

fcntl(fd, F_SETOWN, getpid())

/* 使档案ake the file descriptor 非同步 (使用手册上说只有 O_APPEND 及

O_NONBLOCK, 而 F_SETFL 也可以用...) */

fcntl(fd, F_SETFL, FASYNC)

tcgetattr(fd,&oldtio)/* 储存目前的序列埠设定值 */

/* 设定新的序列埠为标准输入程序 */

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD

newtio.c_iflag = IGNPAR | ICRNL

newtio.c_oflag = 0

newtio.c_lflag = ICANON

newtio.c_cc[VMIN]=1

newtio.c_cc[VTIME]=0

tcflush(fd, TCIFLUSH)

tcsetattr(fd,TCSANOW,&newtio)

/* 等待输入讯号的回圈. 很多有用的事我们将在这做 */

while (STOP==FALSE) {

printf(".\n")usleep(100000)

/* 在收到 SIGIO 後, wait_flag = FALSE, 输入讯号存在则可以被读取 */

if (wait_flag==FALSE) {

res = read(fd,buf,255)

buf[res]=0

printf(":%s:%d\n", buf, res)

if (res==1) STOP=TRUE/* 如果只输入 CR 则停止回圈 */

wait_flag = TRUE /* 等待新的输入讯号 */

}

}

/* 回存旧的序列埠设定值 */

tcsetattr(fd,TCSANOW,&oldtio)

}

在系统结构中,CPU工作的模式有两种,一种是中断,由各种设备发起;一种是轮询,由CPU主动发起。

中断IRQ:

中断允许让设备(如键盘,串口卡,并口等设备)表明它们需要CPU。一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。CPU处理完中断后,就会恢复执行之前被中断的程序。

中断分类:

硬中断+软中断

硬中断:

①非屏蔽中断:不能被屏蔽,硬件发生的错误:内存错误,风扇故障,温度传感器故障等。

②可屏蔽中断:可被CPU忽略或延迟处理。当缓存控制器的外部针脚被触发的时候就会产生这种类型的中断,而中断屏蔽寄存器就会将这样的中断屏蔽掉。我们可以将一个比特位设置为0,来禁用在此针脚触发的中断。

软中断:

是软件实现的中断,也就是程序运行时其他程序对它的中断而硬中断是硬件实现的中断,是程序运行时设备对它的中断。

CPU之间的中断处理(IPI)

处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。

CALL_FUNCTION_VECTOR (向量0xfb)

发往所有的CPU,但不包括发送者,强制这些CPU运行发送者传递过来的函数,相应的中断处理程序叫做call_function_interrupt(),例如,地址存放在群居变量call_data中来传递的函数,可能强制其他所有的CPU都停止,也可能强制它们设置内存类型范围寄存器的内容。通常,这种中断发往所有的CPU,但通过smp_call_function()执行调用函数的CPU除外。

RESCHEDULE_VECTOR (向量0xfc)

当一个CPU接收这种类型的中断时,相应的处理程序限定自己来应答中断,当从中断返回时,所有的重新调度都自动运行。

INVALIDATE_TLB_VECTOR (向量0xfd)

发往所有的CPU,但不包括发送者,强制它们的转换后援缓冲器TLB变为无效。相应的处理程序刷新处理器的某些TLB表项。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8899503.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存