
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表项。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)