首页 > 其他分享 >《信息安全系统设计与实现》第十周学习笔记

《信息安全系统设计与实现》第十周学习笔记

时间:2023-11-07 21:55:04浏览次数:44  
标签:第十 int 信息安全 笔记 中断 信号 act include define

第六章 信号和信号处理

信号和中断

“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移 到中断处理。与发送给CPU的中断请求一样,“信号”是发送给进程的请求,将进程从正常执行转移到中断处理。

进程:一个“进程”就是一系列活动

  • 广义的 “进程”包括:从事日常事务的人。在用户模式或内核模式下运行的Unix/Linux进程。执行机器指令的CPU。
  • “中断”是发送给“进程”的事件,它将“进程”从正常活动转移到其他活动,称为“中断处理”。“进程”可在完成“中断”处理后恢复正常活动。

根据来源,中断可分为三类:

  • 来自硬件的中断
  • 来自其他人的中断
  • 自己造成的中断

按照紧急程度,中断可分为以下几类:

  • 不可屏蔽(NMI)
  • 可屏蔽

进程硬件中断

  • 来自硬件的中断
  • 来自其他处理器的中断
  • 自己造成的中断

Unix/Linux信号示例

  • ctrl+c导致当前运行的进程终止
  • nohup a.out &命令在后台运行一个程序
  • 可以使用sh命令kill pid (or kill -s 9 pid)

Unix/Linux中的信号处理

信号类型

#define	SIGHUP	1
#define	SIGINT	2
#define	SIGQUIT	3
#define	SIGILL	4
#define	SIGTRAP	5
#define	SIGABRT	6
#define	SIGIOT	6
#define	SIGBUS	7
#define	SIGFPE	8
#define	SIGKILL	9
#define	SIGUSR1	10
#define	SIGSEGV	11
#define	SIGUSR2	12
#define	SIGPIPE	13
#define	SIGALRM	14
#define	SIGTERM	15
#define	SIGSTKFLT 16
#define	SIGCHLD	17

#define	SIGCONT	18
#define	SIGSTOP	19
#define	SIGTSTP	20
#dpfine	STGTTTN	21
#define	SIGTTOU	22
#define	SIGURG	23
#define	SIGXCPU	24
#define	SIGXFSZ	25
#define	SIGVTALRM 26
#define	SIGPROF	27
#define	SIGWINCH 28
#define	SIGPOLL	29
#define	SIGPWR	30
#define	SIGSYS	31

信号的来源

  • 来自硬件中断的信号:在执行过程中,一些硬件中断被转换为信号发送给进程硬件信号示例。
    • 中断键(Ctrl+C),它产生一个SIGINT(2)信号。
    • 间隔定时器,当他的时间到期时,会生成一个SIGALRM(14)、SIGTALRM(26)或SIGPROF(27)信号。
    • 其他硬件错误,如总线错误、IO陷进。
  • 来自异常的信号:常见的陷阱信号有SIGFPE(8),表示浮点异常(除以0),最常见也是最可怕的时SIGSEGV(11),表示段错误。
  • 来自其他进程的信号:进程可以使用kill(pid,sig)系统调用向pid标识的目标进程发送信号。

信号处理函数

每个进程PROC 都有一个信号处理数组 int sig[32]。Sig[32]数组的每个条目都指定了如何处理相应的信号,其中0表示 DEFault(默认),1表示 IGNore(忽略).其他非零值表示用户模式下预先安装的信号捕捉(处理)函数。下图给出了信号位向量、屏蔽位向量和信号处理函数。

安装信号捕捉函数

进程可使用系统调用

int r=signal(int signal_number,void *handler)

来修改选定信号编号的处理函数

sigaction()的使用示例

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
//#include <siginfo.h>

void handler(int sig, siginfo_t *siginfo, void *context)
{
    printf("handler: sig=%d from PID=%d UID=%d\n",sig, siginfo->si_pid, siginfo->si_uid);
}
int main(int argc, char *argv[])
{
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_sigaction = &handler;
    act.sa_flags = SA_SIGINFO; 
    sigaction(SIGTERM, &act, NULL);
    printf("proc PID=%d looping\n", getpid()); 
    printf ("enter kill PID to send SIGTERM signal to it\n"); 
    while(1)
    {
        sleep (10);
    }
}

信号处理步骤

处于内核模式时,会检查信号并处理未完成的信号
重置用户安装的信号捕捉函数
信号和唤醒:在Unix/Linux内核中有两种SLEEP进程

信号用作IPC

示例
段错误捕捉函数

#include <stdio.h>
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 
#include <setjmp.h>
#include <string.h>

//#include <siginfo.h>

jmp_buf env;
int count = 0;

void handler(int sig, siginfo_t *siginfo, void *context)
{
    printf ("handler sig=%d from PID=%d UID=%d count=%d\n", sig, siginfo->si_pid, siginfo->si_uid, ++count); 
    if (count >= 4) // let it occur up to 4 times
        longjmp(env, 1234);
}

int BAD()
{
    int *ip = 0;
    printf("in BAD(): try to dereference NULL pointer\n");
    *ip = 123;	// dereference a NULL pointer
    printf("should not see this line\n");
}

int main (int argc, char *argv[])
{
    int r;
    struct sigaction act; 
    memset (&act, 0, sizeof(act)); 
    act.sa_sigaction = &handler; 
    act.sa_flags = SA_SIGINFO;
    sigaction(SIGSEGV, &act, NULL); 
    if ((r = setjmp(env)) == 0) 
        BAD();
    else
        printf("proc %d survived SEGMENTATION FAULT: r=%d\n",getpid(), r);

    printf ("proc %d looping\n" ,getpid());
    while(1);
}

苏格拉底挑战

  • 信号和中断

  • 信号的来源

标签:第十,int,信息安全,笔记,中断,信号,act,include,define
From: https://www.cnblogs.com/wangqi3206/p/17814012.html

相关文章

  • sharding分表应用笔记(一)——分表数据源配置
    sharding分表应用笔记(一)——分表数据源配置目录sharding分表应用笔记(一)——分表数据源配置1前言2配置2.1相关依赖2.2命名空间配置2.2.1引入sharding命名空间2.2.2物理数据源配置2.2.3分表数据源配置3外部链接1前言应用背景:物理数据源只有一个;对于部分数据量大的表实行......
  • openGauss学习笔记-117 openGauss 数据库管理-设置数据库审计-查看审计结果
    openGauss学习笔记-117openGauss数据库管理-设置数据库审计-查看审计结果117.1前提条件审计功能总开关已开启。需要审计的审计项开关已开启。数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。数据库各个节点审计日志单独记录。......
  • Java拾贝第十九天——注解
    Annotation注解(Annotation)是一种可以作用于类、属性或方法的,带有特定功能的,特殊的"注释"。且注解不影响程序的运行:不论是否使用注解,代码都可以正常执行。Annotation接口定义如下publicinterfaceAnnotation{ booleanequals(Objectobj); inthashCode(); StringtoSt......
  • kafka第一天学习笔记
    以下是Kafka第一天的学习笔记:Kafka是什么?ApacheKafka是一个开源的分布式流处理平台,用于构建实时数据管道和流应用程序。它提供了高吞吐量、可扩展、可靠的消息传递,可以处理来自多个源的大量数据。Kafka的核心组件Kafka有四个核心组件:生产者(Producer)、代理(Broker)、消费者(Consumer)和......
  • 《Unix/Linux系统编程》教材学习笔记第六章
    chapter6信号和中断“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。与发送给CPU的中断请求一样,“信号”是发送给进程的请求,将进程从正常执行转移到中断处理。在讨论信号和信号处理之前,先来回顾中断的概念和机制,这有助于正确看待信号。(1)首......
  • python虚拟环境的使用笔记
    方法一:在后台手动安装1、输入命令:pip3installvirtualenv2、指定目录:cd....;然后输入:virtualenvenv_django(创建虚拟环境) 3、激活该虚拟环境:      windows进到目录里,的Script文件夹输入:activate       linux:soruseenv1/Script/activate ......
  • python初学者学习笔记-第五章-函数
    chapter5/函数5.1函数基础5.1.1函数形式函数是可实现一个或多个功能的代码块;函数的特点:重用性、模块化;Python的内置函数,如print()、len()、min()、max()等;同时,我们也可以自定义函数;5.1.2函数调用参数是函数重要组成部分,python的参数灵活多样;参数类型:默认参数,关键字......
  • ReentrantLock源码笔记 - 获取锁(JDK 1.8)
    ReentrantLock学习-获取锁(JDK1.8)ReentrantLock提供非公平锁与公平锁两种加锁方式,默认加锁方式为非公平锁。ReentrantLock类的结构为:从图中可以看出,ReentrantLock类包含三个静态内部类:SyncNonfairSyncFairSync其中Sync类继承AbstractQueuedSynchronize(AQS),Nonf......
  • ReentrantLock源码笔记 - 释放锁(JDK 1.8)
    ReentrantLock源码学习-释放锁(unlock)上次谈到了利用ReentrantLock的非公平和公平加锁方式,那么接下来看看释放锁的流程首先调用ReentrantLock的unlock方法publicvoidunlock(){sync.release(1);}然后会调用AbstractQueuedSynchronizer(AQS)的release方法,在这个方法......
  • python初学者学习笔记-第四章-条件和循环
    chapter4/条件和循环4.1条件4.1.1基本形式条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的子程序;每个条件后面要使用冒号”:”,表示满足条件后执行子程序。缩进来划分子程序范围,相同缩进的语句组成一个整体子程序。如果“condition”为True,将执行"sub_p......