精华内容
下载资源
问答
  • 提高作业效率中断功能”指的是什么?任何人都有过这样经验,就是“将鸡蛋放进沸腾热水中,直到鸡蛋煮熟10分钟内要确认好几次时钟”经历。在单片机世界中也同样,在等待某种状态达成时,具有对对象进行...

    提高作业效率的“中断功能”指的是什么?

    任何人都有过这样的经验,就是“将鸡蛋放进沸腾的热水中,直到鸡蛋煮熟的10分钟内要确认好几次时钟”的经历。在单片机的世界中也同样,在等待某种状态达成时,具有对对象进行定期检查的方法。例如,在等待向GPIO(通用I/O端口)的输入从0变为1时,程序可以一定的间隔来检查GPIO的状态。这种处理被称为“轮询”。

    轮询虽然是一种了解状态变化的简单方法,但是如果检查的频度低(间隔长)就会错过变化,如果频度过高(间隔短),即使查也查不到变化“空耗”。由于轮询通过简单的程序便能完成处理,所以在掌握对象的变化频度时是有效的。但是,进行多次检查也会给单片机带来负荷,对功耗不利。

    因此就要用"中断功能"。产生中断时,CPU会暂时停止正在执行的任务,转而进行别的任务。也就是有别的任务“穿插”进来的意思 。当中途穿插进来的任务结束后,CPU再返回处理原来的任务。

    a121f3e3fed93ea0d29d4aef544379c0.png
    图1:中断与轮询

    设想一下你在工作的同时煮鸡蛋的情况。 由于你不想停下手中的工作,所以把鸡蛋放入热水中后就设置定时器并继续工作,10分钟后定时器一响就把鸡蛋从热水中捞起。这时,定时器的鸣叫就是中断 ,而“把鸡蛋从热水中捞起”就是穿插进来的工作。大家可以通过这种方式来了解中断功能。

    单片机中的中断处理 中断产生于单片机内部和外部的各种设备。于开关和感应器等单片机外部的中断称为外部引脚中断,来自这些机器的中断信号由名为“IRQ”的引脚接收,再向中断控制器发出通知。IRQ为“Interrupt ReQuest”的略称,意思为“中断请求”。另外,来自单 片机内部的定时器和GPIO、串行通信设备UART等外设机器的中断被称为外部设备中断,中断信号直接从各外部设备通知中断控制器。

    在中断控制器中,各种设备的中断信号按照先来后到的顺序,以适当的顺序被传送到CPU。而且,中断被设为无效的设备的中断信号将不会被传送到CPU,也就意味着可以忽视(屏蔽)这些信号。CPU按照从中断控制器接收到的指示来执行对应的程序(中断处理)。 CPU一旦接收到中断控制器的中断信号,首先将终止执行中的程序。然而,会自动保存“从何处重启”的出栈(POP)信息,这被称为“进栈(PUSH)”。进栈结束后,将开始由中断执行的程序。该程序结束时,进栈信息将回 送到CPU,这种现象被称为“出栈”。由于进栈和出栈都由CPU自动执行,因此程序设计者不必因顺序问题而费心。

    505f3535f17e729318c6fb09e49fd4d7.png

    例如,通过UART执行串行通信时,经常监视字节是否被接收了而导致效率不佳。所以,多数情况下都对程序进行如下编程,即在信息送达 时就会产生中断并进行适当的处理,另外,使定时器产生中断的情况也不在少数。进行“经过了一定时间后该做什么”这类处理时,应进行如下编程,即通过来自定时器的信号开始进行处理。如上所述,在有效利用单片机方面,中断功能发挥了很大的作用。

    在某单片机中,从IO30引脚到IO35引脚接收来自外部的中断信号。这次是将定时器输出引导到IO0引脚,再将它传送到IO31引脚作为中断信号。因此,要从IO30引脚到GND的部分设置引脚接口,由底板用的电线将IO0和IO31连接起来。

    在示例程序中预先准备了如下功能,即当单片机的外部中断信号引脚(从IO30到IO35中的一个)的输入从L电平变为H电平时,LED灯将启动。而且是在检测到相当于上述所说明的“外部引脚中断”的中断信号后才会变化。从IO0引脚进行定时器输出,并将之与中断输入引脚即IO31引脚连接,通过这样的方式便可以与一定的时间间隔发生中断。

    9b8b2e2fba77204a16936265812c5716.png
     
    #include <rxduino.h>
    
    #define INTERVAL 1
    
    int i = 0;
    
    void irq3()   /向IO31引脚输入中断时此函数启动,由 此可使LED灯按顺序亮灭
    {
        switch( i) 
         {
            case 0:
                digitalWrite( PIN_LED3, 0);  //LED3 灭灯
                digitalWrite( PIN_LED0, 1);  //LED0 亮灯
                i++;
                break;
            case 1:
                digitalWrite( PIN_LED0, 0);  //LED0 灭灯
                digitalWrite( PIN_LED1, 1);  //LED1 亮灯
                i++;
                break;
            case 2:
                digitalWrite( PIN_LED1, 0);  //LED1 灭灯
                digitalWrite( PIN_LED2, 1);  //LED2 亮灯
                i++;
                break;
            case 3:
                digitalWrite( PIN_LED2, 0);  //LED2 灭灯
                digitalWrite( PIN_LED3, 1);  //LED3 亮灯
                i = 0;
                break;
        }
    } 
     
    void setup()   //输出端引脚的设定、设定为LED的初期状态为灭灯,设定中断时的运行函数、设 定定时器的频率
    
    {
        pinMode (PIN_LED0,OUTPUT);  //设定为从GPIO向LED0输出信号
        pinMode(PIN_LED1,OUTPUT);  //设定为从GPIO向LED1输出信号
        pinMode(PIN_LED2,OUTPUT);  //设定为从 GPIO向LED2输出信号
        pinMode(PIN_LED3,OUTPUT);  //设定为从GPIO向LED3输出信号
        pinMode(PIN_P21, OUTPUT);    //将定时器输出时使用的IO0引脚也设为用于输出
    
        digitalWrite( PIN_LED0, 0);   // LED0 灭灯
        digitalWrite( PIN_LED1, 0);   // LED1 灭灯
        digitalWrite( PIN_LED2, 0);   // LED2 灭灯
        digitalWrite( PIN_LED3, 0);   // LED3 灭灯
    
        attachInterrupt(3, irq3, RISING); //将 IO31(IRQ3)在接收中断时调用的函数设为irq3()
    
        tone(PIN_P21, INTERVAL, 0);  //从IO0以INTERVAL中设定的频率输出
    } 
    
    void loop()   // loop()中不存在需要进行的处理
    {
    }

    在例中,可对分别与前述中断信号输入引脚对应的处理。本次所示的是根据向IO31引脚输入的变化(从L电平变为H电平)来产生中断的情况。第48行的attachInterrupt()定义了在某个输入引脚出现某种变化时该调用什么函数。因此,设定为根据输入IO31引脚的中断信号来启动irq3()。这样的设定只需在setup()中定义一次便能在整个程序中有效。除此以外,在setup()中还记述了定时器的定义、定时器输出引脚的设定、LED输出的设定等初始条件。


    没有通过loop()函数进行的处理。取而代之的是由irq3()这个函数进行处理。从这个函数来看是看不出它是从程序中调用的。但是,正是由于这个函数,才能使中断信号进入IO31引脚时使LED的光发生变化。在函数irq3()中,四盏LED中只有一盏亮灯,这个函数一旦被调用,亮灯的LED就发生一次变化。为了让人看得到这个“变化”,在case标签的部分,通过来自GPIO的输出来灭灯且使旁边的LED亮灯(边缘的LED灯亮灯时,相反侧的边缘的LED亮灯或灭灯)。


    为了应对不知何时会发生的意外,中断就是非常有效的应对方法。而且,中断还可以减少程序的不必要运行,从而可降低功耗。也可以说,为了真正有效地利用单片机,这是一项不可缺少的技术。

    展开全文
  • STM 32 外部中断

    2021-04-18 19:36:24
    什么是外部中断 : 外部中断单片机实时地处理外部事件一...请求CPU及时处珲中断请求,如中断条件 (2)故障处理功能:针对难以预料情况或故障,如掉电、存储出错、运算溢出等,可通过中断系统由故障源向CPU发出中断

    什么是外部中断 :

    外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去

    中断的功能 :
    (1)实时处理功能:在实时控制中,现场的各种参数、信息均随时问和现场而变化。这些外界变量可根据要求随时向CPU发出中断申请.请求CPU及时处珲中断请求,如中断条件
    (2)故障处理功能:针对难以预料的情况或故障,如掉电、存储出错、运算溢出等,可通过中断系统由故障源向CPU发出中断请求,再由CPU转到相应的故障处理程序进行处理。
    (3)分时操作:中断可以解决快速的CPU与慢速的外设之问的矛盾,使CPU和外设同时工作。CPU在启动外设工作后继续执行主程序,同时外设也在工作。每当外设做完一件事就发出中断申请,请求CPU中断它正在执行的程序,转去执行中断服务程序(一般情况是处理输入/输出数据),中断处理完之后,CPU恢复执行主程序,外设也继续工作。这样,CPU可启动多个外设同时工作,大大地提高其效率。

    触发方式:
    外部中断的触发有两种触发方式:电平触发方式和跳沿触发方式。

    其他的介绍 可以自行去百度

    下面的是一个下降沿触发的中断的编写过程

    由于也是基于固件库编写的 所以我们在最开始也是需要去到USER 文件夹下新建一个文件 文件夹下添加.h .c 文件 然后将这个.c 文件导入到我们的工程中
    在这里插入图片描述
    像这样就可以了 由于自己是基于之前的项目进行的 所以文件会有点多
    然后就是添加环境 这个前面的文章也有 自己是把这个文件命名为nvic

    对于nvic.h 文件

    #include "stm32f10x.h"
    void nvic_init(void);
    
    

    在main 函数里面添加nvic_init 这个函数

    nvic .c 文件
    添加头文件 那些重复的操作 不在多赘述

    直接开始 最重要的事
    配置中断 分为下面这四步
    1 .初始化用来中断的GPIO
    2.初始化EXIT
    3配置 NVIC (中断优先级)
    4 , 编写中断函数

    第一步 配置GPIO
    我直接使用项目的震动感应模块的GPIO

    直接来到第二步

    在这里插入图片描述

    找到这个结构体
    在这里插入图片描述

    将结构体的名字复制到nvic.c
    起名

    EXTI_InitTypeDef exit_init;

    然后我们只需要在下面输入这个结构体名字加一个点
    就可以对这个结构体的成员进行赋值
    在这里插入图片描述

    第三 给Nvic进行配置
    在这里插入图片描述

    第四 编写中断服务函数
    在这里插入图片描述
    我们需要在启动文件里面去找到这个函数

    展开全文
  • 51单片机外部中断

    2021-01-16 19:27:24
    中断请求 -> 中断响应 -> 中断处理 -> 中断返回 什么是中断系统 计算机执行某程序时,发生了紧急事件或有特殊请求,CPU暂停某程序执行,转而去处理上述事件或请求,处理完毕后再重新执行某程序过程叫做...

    中断系统

    中断请求 -> 中断响应 -> 中断处理 -> 中断返回

    什么是中断系统

    计算机执行某程序时,发生了紧急事件或有特殊请求,CPU暂停某程序的执行,转而去处理上述事件或请求,处理完毕后再重新执行某程序的过程叫做中断。

    数据的输入/输出传送方式

    1.无条件传送方式:

    一方对另一方来说总是准备好的

    2.查询传送方式(LOOK UP):

    传送前一方先查询另一方的状态,若已经准备好就传送,否则就继续查询/等待。

    3.中断传送方式(IRQ):

    一方通过申请中断的方式与另一方进行数据传送。

    4.直接存储器存储方式(DMA):

    双方直接通过总线传送数据,不经CPU中转。适用于数据量大高速通讯的设备,不占用CPU时间。

    51子系列允许5个中断源

    51单片机中断系统内部结构图

    外部中断源(2个):

    INT0 — 由P3.2端口线引入,低电平或下降沿引起
    INT1 — 由P3.3端口线引入,低电平或下降沿引起
    这两个外部中断源标志和他们的触发方式控制位由特殊功能寄存器TCON的低四位控制.

    内部中断源(3个):

    T0 — 定时器/计数器0中断,由T0回零溢出引起.
    T1 — 定时器/计数器1中断,由T1回零溢出引起.
    TI/RI —串行I/O中断,串行端口完成一帧字符发送/接收后引起
    这三个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中.

    如何去使用单片机中断系统

    1. 允许中断

    在这里插入图片描述

    2.配置中断方式

    在这里插入图片描述

    编写中断函数

    中断优先级处理原则

    对同时发生多个终端申请时:

    1. 不同优先级的中断同时申请(很难遇到)----先高后低

    2. 相同优先级的中断同时申请(很难遇到)----按序进行

    3. 正处理低优先级中断又接到高级别中断----高打断低

    4. 正处理高优先级中断又接到低级别中断----高不理低

    单片机同优先级中内部查询顺序

    内部查询顺序:在同时受到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序.这相当于在同一优先级内,还同时存在另一辅助优先级结构,其查询顺序如下:
    在这里插入图片描述

    中断响应条件

    • 此中断源的中断允许位为1
    • 此中断CPU中断打开(EA=1)
    • 中断源有中断请求
    例 :外部中断1初始化
    • EA = 1;//开总中断
    • EX1 = 1;//开外部中断1
    • IT1 = 1;//跳变沿触发

    中断处理函数

    void int1() interrupt 2 //中断处理函数,加关键字interrupt和入口号
    {
    	中断处理语句
    }
    
    展开全文
  • 信号软件中断,在软件层次上对中断机制一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样。信号异步,一个进程不必通过任何操作来等待信号到达,事实上,进程也不知道...

    什么是信号

    信号是unixLinux系统响应某些条件而产生的一个事件。简单的理解信号就是一种Linux/unix环境下进程间通讯的一种机制,用来提醒进程一个事件已经发生。

     

    信号是软件中断,是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

    信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。

     

     

    信号的产生

     

    1)硬件来源:除数为零、无效的存储访问等硬件异常产生信号,这些事件通常由硬件(:CPU)检测到,并将其通知给Linux操作系统内核,然后内核生成相应的信号,并把信号发送给该事件发生时正在进行的程序。

    2)软件来源:用户在终端下调用kill命令向进程发送任务信号;进程调用killsigqueue函数发送信号;当检测到某种软件条件已经具备时发出信号,如由alarmsettimer设置的定时器超时时将生成SIGALRM信号等多种情景均可产生信号。

     

    3)键盘输入:用户键入了能够产生信号的终端特殊字符。其中包括中断字符(Ctrl+C)、暂停字符(Ctrl+Z)。

     

     

    Linux中的信号

     

    /usr/include/bits/signum.h 下我们可以查看Linux系统的信号,每一个信号都有一个编号和一个宏定义的名称,当我们使用这些信号时,最好使用它们的名称,因为在不同的系统中,信号的编号可能是不同的。

     

    我们也可以使用 kill -l 命令来查看所有的信号:

     

     

    可以看到Linux中系统一共支持64种信号,其中131号信号为普通信号(不可靠信号),3464为实时信号(可靠信号)。

     

    可靠信号与不可靠信号的区别:

    1)这里的不可靠主要是不支持信号队列,就是当多个信号发生在进程中的时候(收到信号的速度超过进程处理的速度的时候),这些没来的及处理的信号就会被丢掉,仅仅留下一个信号。

    2)可靠信号是多个信号发送到进程的时候(收到信号的速度超过进程处理信号的速度的时候),这些没来的及处理的信号就会排入进程的队列。等进程有机会来处理的时候,依次再处理,信号不丢失。

     

     

     

    这里详细列举了 1~31 号信号的来源,作为参考:

    #define	SIGHUP		1	/* Hangup (POSIX).  */
    //当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作为终止进程
    
    #define	SIGINT		2	/* Interrupt (ANSI).  */
    //当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号.默认动作为终止进程。
    
    #define	SIGQUIT		3	/* Quit (POSIX).  */
    //当用户按下<ctrl+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号.默认动作为终止进程。
    
    #define	SIGILL		4	/* Illegal instruction (ANSI).  */
    //CPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件
    
    #define	SIGTRAP		5	/* Trace trap (POSIX).  */
    //该信号由断点指令或其他 trap指令产生.默认动作为终止进程并产生core文件.
    
    #define	SIGABRT		6	/* Abort (ANSI).  */
    //调用abort函数时产生该信号.默认动作为终止进程并产生core文件.
    
    #define	SIGIOT		6	/* IOT trap (4.2 BSD).  */
    
    #define	SIGBUS		7	/* BUS error (4.2 BSD).  */
    //非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件.
    
    #define	SIGFPE		8	/* Floating-point exception (ANSI).  */
    //在发生致命的运算错误时发出.
    
    //不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误.默认动作为终止进程并产生core文件.
    
    #define	SIGKILL		9	/* Kill, unblockable (POSIX).  */
    //无条件终止进程。本信号不能被忽略,处理和阻塞.默认动作为终止进程.
    
    //它向系统管理员提供了可以杀死任何进程的方法。
    #define	SIGUSR1		10	/* User-defined signal 1 (POSIX).  */
    
    //用户定义的信号.即程序员可以在程序中定义并使用该信号.默认动作为终止进程。
    
    #define	SIGSEGV		11	/* Segmentation violation (ANSI).  */
    //指示进程进行了无效内存访问.默认动作为终止进程并产生core文件.
    
    #define	SIGUSR2		12	/* User-defined signal 2 (POSIX).  */
    //另外一个用户自定义信号,程序员可以在程序中定义并使用该信号.默认动作为终止进程.
    
    #define	SIGPIPE		13	/* Broken pipe (POSIX).  */
    //向一个没有读端的管道写数据.默认动作为终止进程.
    
    #define	SIGALRM		14	/* Alarm clock (POSIX).  */
    //定时器超时,超时的时间 由系统调用alarm设置.默认动作为终止进程.
    
    #define	SIGTERM		15	/* Termination (ANSI).  */
    //程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止.通常用来要示程序正常退出.
    //执行shell命令Kill时,缺省产生这个信号。默认动作为终止进程。
    
    #define	SIGSTKFLT	16	/* Stack fault.  */
    //Linux专用,数学协处理器的栈异常(不懂什么意思)
    
    #define	SIGCLD		SIGCHLD	/* Same as SIGCHLD (System V).  */
    #define	SIGCHLD		17	/* Child status has changed (POSIX).  */
    //子进程结束时,父进程会收到这个信号.默认动作为忽略这个信号.
    
    #define	SIGCONT		18	/* Continue (POSIX).  */
    //如果进程已停止,则使其继续运行.默认动作为继续/忽略
    
    #define	SIGSTOP		19	/* Stop, unblockable (POSIX).  */
    //停止进程的执行.信号不能被忽略,处理和阻塞.默认动作为暂停进程.
    
    #define	SIGTSTP		20	/* Keyboard stop (POSIX).  */
    //停止终端交互进程的运行.按下<ctrl+z>组合键时发出这个信号.默认动作为暂停进程.
    
    #define	SIGTTIN		21	/* Background read from tty (POSIX).  */
    //后台进程读终端控制台.默认动作为暂停进程.
    
    #define	SIGTTOU		22	/* Background write to tty (POSIX).  */
    //该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生.默认动作为暂停进程.
    
    #define	SIGURG		23	/* Urgent condition on socket (4.2 BSD).  */
    //套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达.默认动作为忽略该信号。
    
    #define	SIGXCPU		24	/* CPU limit exceeded (4.2 BSD).  */
    //进程执行时间超过了分配给该进程的CPU时间系统产生该信号并发送给该进程.默认动作为终止进程。
    
    #define	SIGXFSZ		25	/* File size limit exceeded (4.2 BSD).  */
    //超过文件的最大长度设置.默认动作为终止进程.
    
    #define	SIGVTALRM	26	/* Virtual alarm clock (4.2 BSD).  */
    //虚拟时钟超时时产生该信号.类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间.默认动作为终止进程。
    
    #define	SIGPROF		27	/* Profiling alarm clock (4.2 BSD).  */
    //类似于SIGVTALRM,它不仅包括该进程占用CPU时间还包括执行系统调用时间.默认动作为终止进程。
    
    #define	SIGWINCH	28	/* Window size change (4.3 BSD, Sun).  */
    //窗口变化大小时发出.默认动作为忽略该信号.
    
    #define	SIGPOLL		SIGIO	/* Pollable event occurred (System V).  */
    #define	SIGIO		29	/* I/O now possible (4.2 BSD).  */
    //此信号向进程指示发出了一个异步IO事件.默认动作为忽略
    
    #define	SIGPWR		30	/* Power failure restart (System V).  */
    //关机.默认动作为终止进程。
    
    #define SIGSYS		31	/* Bad system call.  */
    //无效的系统调用.默认动作为终止进程并产生core文件
    
    
    

    对信号的回应

     

    信号因某些事件而产生后,会于稍后被传递给某一进程,进程也会采取某些措施来回应信号。(在产生和到达期间,信号处于等待状态。)

    信号到达后,进程视具体信号执行如下默认操作之一。

    (1)忽略信号:内核将信号丢弃,信号对进程没有任何影响(进程永远不知道曾经出现过该信号)。

    (2)终止进程:这有时是指进程异常终止,而不是进程因调用exit()而发生的正常终止。

    (3)产生核心转储文件,同时进程终止:核心转储文件包含对进程虚拟内存的镜像,可将其加载到调试器中以检查进程终止时的状态。

    (4)停止进程:使进程暂停执行。(不是终止)

    (5)执行之前被暂停的进程。

     

    除了根据特定信号而采取默认行为之外,程序也能改变信号到达时的响应行为。程序可以将对信号的处置设置为如下之一

    1、 忽略此信号(忽略)。(SIG_IGN)

    2、 执行该信号的默认处理动作。(SIG_DEF)

    3、提供一个信号处理函数,要求内核在处理信号时切换到用户态执行处理这个函数。

    如果不想按照默认处理动作来处理信号,我们可以通过signal函数来对信号自定义捕捉并设置响应方式。

     

    改变信号响应方式:signal()

     

    signal (系统调用)

    头文件 #include<signal.h>

    函数原型 void(*signal(int sig, void(*func)(int)))(int)

     

    函数说明 signal是带有sigfunc两个参数的函数。准备捕获或者忽略的指定信号由sig给出,接受到指定的信号后所采取的 响应方式由参数func决定。func是一个信号处理函数,它必须有一个int型参数并且返回类型为voidfunc可以由以下两个特殊值来代替:

     

    SIG_DEF  采取默认的响应方式

    SIG_IGN  忽略该信号

     

    函数功能 该函数可以改变对某一信号的响应方式。比如:第17号信号SIGCHLD,该信号是在子进程结束时发送给父进程,系统对此信号的默认响应方式是忽略该信号,而我们可以通过signal函数将其响应方式改为打印个“hello world”。具体操作如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include<signal.h>
    #include<unistd.h>
    
    void func(int sig)
    {
        printf("hello world\n");    
    }
    
    int main()
    {
        signal(SIGCHLD, func);   //当接收到SIGCHLD信号时,执行信号处理函数func
    
        pid_t pid = fork();
        assert( pid != -1);
        int t = 0;
    
        if(pid == 0)   
        {
            t = 3;
            int i = 0;
            for(; i < t; i++)  //子进程会先于父进程结束
            {
                sleep(1);
                printf("child = %d\n", i);
            }
        }
        else
        {
            t = 7;
            int j = 0;
            for(; j < t; j++)
            {
                sleep(1);
                printf("parent = %d\n", j);
            }
        }
    
        exit(0);
        
    }
    

    运行结果为:

     

     

     

    向指定进程发送信号:kill()

     

    kill() 系统调用

     

    头文件:#include<sys/types.h>

     #include<signal.h>

    函数原型:int killpid_t pid, int sig

    函数说明:函数kill将参数sig指定的信号发送给由参数pid所指定的进程

    返回值:成功时返回 0;失败时返回 -1,并设置errno变量。

     

     

            还记得我们以前使用过得 kill 命令吗?其具体做法是:kill +参数+ pid,即可强制结束某一进程。现在我们知道,其实现原理就是通过向进程发送信号达到的。在不指定信号的情况下,将默认发送SIGTERM15)信号终止指定进程。当kill命令无法结束某一进程时,我们还使用过 kill -9 pid,其原理大家应该也能猜到,就是发送SIGKILL9)信号无条件终止这个进程。

     

    知道了原理,我们就可以自己编写一道程序实现与kill命令相似的功能。

       首先,我们写一个会产生死循环的函数,名为 kill_test。代码如下:

    
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        while(1)
        {
            sleep(1);
            printf("please kill me\n");    
        }
    
        exit(0);
        
    }

    将这个程序运行后,我们通过 kill 命令可以很轻松地将其终止:

    然后这里我们自己写一个名为kill的程序,其代码为:

     

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<string.h>
    #include<assert.h>
    #include<fcntl.h>
    #include<signal.h>
    
    int main(int argc, char* argv[])
    {
        if(argc != 2)     //只接受两个参数
        {
            printf("argc error");    //否则打印错误信息
            exit(0);    
        }
    
        int pid = 0;
        sscanf(argv[1],"%d",&pid);   //从参数中提取目标进程的pid
        
        if(kill(pid,SIGTERM) == -1)   //把SIGTERM(15)信号发送给指定进程
        {
            perror("kill error");     //如果失败,打印错误信息
        }
        exit(0);
    }
    

     

    再次运行这个死循环程序,我们就可以用自己的kill程序结束掉它:

     

     

     

     

    两者所达到的目的是相同的。

     

     

     

     

     

     

     

    展开全文
  • ③当前没有发生复位(RESET) 保持(HOLD) 内部中断和非屏蔽中断请求(NMI) ④若当前执行指令开中断(STI)和中断返回指令(IRET),则它们执行完后再执行一条指令,CPU才能响应INTR请求 8086硬件中断和软件中断...
  • InterruptedException异常 在了解InterruptedException异常之前应该了解以下的几个关于线程的一些基础知识。而且得知道什么时候会抛InterruptedException异常 ...线程在一定的条件下会发生状态的改变,下面线...
  • 学习Linux(37)信号

    2020-07-25 18:39:18
    用于通知进程发生了异步事件,它Linux系统响应某些条件而产生一个事件,它在软件层次上对中断机制一种模拟,一种异步通信方式,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样。...
  • InterruptedException异常 在了解InterruptedException异常之前应该了解以下的几个关于线程的一些基础知识。...线程在一定的条件下会发生状态的改变,下面线程的一些状态 初始(NEW):新建一个线程的对象...
  • 用于通知进程发生了异步事件,它Linux系统响应某些条件而产生一个事件,它在软件层次上对中断机制一种模拟,一种异步通信方式,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样。...
  • InterruptedException异常 ...线程在一定的条件下会发生状态的改变,下面线程的一些状态 初始(NEW):新建一个线程的对象,还未调用start方法 运行(RUNNABLE):java线程中将已经准备就绪(Ready)和正在运行中(R
  • 1.4 新64位机上64位类型是什么? 3 指针声明 3 1.5 这样声明有什么问题?char *p1, p2; 我在使用p2时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样代码有什么问题?...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.4 新64位机上64位类型是什么? 3 指针声明 3 1.5 这样声明有什么问题?char *p1, p2; 我在使用p2时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样代码有什么问题?...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.4 新64位机上64位类型是什么? 指针声明 1.5 这样声明有什么问题?char*p1,p2;我在使用p2时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样代码有什么问题?char*p;*p=...
  • 6.1 给出可重用资源...6.2 可能发生死锁所必须的三个条件是什么? 互斥,占有且等待,非抢占。 6.3 产生死锁的第4个条件是什么? 循环等待。 6.4 如何防止占有且等待的条件? 可以要求进程一次性地请求所有...
  • 操作系统常见问题

    2020-10-05 15:48:45
    发生系统调用时:这处于用户态进程主动请求切换到内核态一种方式。用户态进程通过系统调用申请使用操作系统提供系统调用服务例程来处理任务。而系统调用机制,其核心仍使用了操作系统为用户特别开发...
  • 操作系统重点

    2013-01-15 16:59:50
     记忆要点:操作系统是什么——是系统软件;  操作系统管什么——控制和管理计算机系统内各种资源;  操作系统有何用——扩充硬件功能,方便用户使用。  功能  操作系统五大主要功能:存储管理、进程和处理机...
  • (4)用户界面具备更短响应时间:现代GUI框架中大都使用一个事件分发线程(类似于中断响应函数)来替代主事件循环,当用户界面用有事件发生时,在事件线程中将调用对应事件处理函数(类似于中断处理函数) ...
  • PCI.EXPRESS系统体系结构标准教材.pdf

    热门讨论 2013-02-17 16:21:16
    9.2.3 生成msi中断请求的基础 9.2.4 中断处理程序处理时的存储器同步 9.2.5 中断延迟 9.2.6 一些规则、建议等等 9.3 传统的pci中断发送机制 9.3.1 背景知识——pci中断信令 9.3.2 虚拟intx信令 9.4 设备可以同时支持...
  • 三个基本状态等待、执行和就绪,在一定的条件下,进程的状态将发生转换。 (2)进程调度算法 主要有先来先服务(FCFS)、时间片轮转法、多级反馈轮转法、优先数法。 (3)进程控制块(PCB)进程...
  • 单片机期末考试题目及答案详解

    热门讨论 2009-06-23 10:30:30
    同级中断请求按时间先后顺序响应 D.同级中断按CPU查询次序响应中断请求 15.执行中断返回指令,要从堆栈弹出断点地址,以便去执行被中断了主程序。从堆栈弹出断点地址送给 A.A B.CY C.PC D.DPTR 16....
  • 普遍使用 Android APP 技术架构,往往在一个界面中存在大量业务逻辑,而业务逻辑中充斥着各种网络请求、数据操作等行为,整个项目中也没有模块概念,只有简单以业务逻辑划分文件夹,并且业务之间也...
  • IIS6.0 IIS,互联网信息服务

    热门讨论 2010-08-23 21:20:55
    Internet Information Services(IIS,互联网信息服务),由微软公司提供基于运行Microsoft Windows互联网基本服务。最初Windows NT版本可选包,随后内置在Windows 2000、Windows XP Professional和...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式重要性 建筑和软件中模式之异同 A. 创建模式 设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证...
  • 软件工程教程

    2012-07-06 23:10:29
    问:开发这个软件目标是什么? 答: 提高用户对音乐学习和娱乐 参与创作音乐 项目背景--钢琴练奏师 问:为什么传统音乐程序不好? 答: 传统音乐程序功能单一,容易令人感到枯燥无味,没有吸引力; 传统音乐...
  • 与开发人员在测试组环境多次重复以上步骤,发现11群计次表话单有时正常,有时其出中继群号就为一个随机值,发生异常频率比较高。为什么其它群话单正常,唯独11群不正常呢?11群四个群中最小群,其中继计...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

发生中断请求的条件是什么