为什么在linux中中断服务程序中不能调用可能阻塞的函数

为什么在linux中中断服务程序中不能调用可能阻塞的函数,第1张

任何 *** 作系统,在中断服务函数中,都不能阻塞,另外中断服务函数还应该越短越好,主要原因是:

1、 中断服务函数的执行和一般进程执行某个函数时的上下文环境 (context) 是不一样的,是在一个特定的context中,这个环境不许阻塞,否则系统异常。

2、 中断服务函数过长甚至阻塞,会严重影响整个系统运行效率甚至挂死 (想想看,系统无时无刻不在产生各种各样中断, *** 作系统本身的运行也依靠某些精确发生的中断,比如定时器靠时钟中断等,如果某个中断处理函数执行了很长时间 【阻塞可以理解成导致函数执行了无限长的时间】,整个系统就无法正常工作了)

pause函数使调用进程挂起直至捕捉到一个信号。

#include <unistd.h>

int pause(void)

返回:-1,errno设置为EINTR

只有执行了一个信号处理程序并从其返回时,pause才返回。

/*************************************

使用alarm函数定时,然后通过pause()等待alarm函数的信号。

1:使用alarm函数的时候要注意alarm函数的覆盖性,即在一个进程中采用一次alarm函数则该进程之前的alarm函数将失效。

2:pause函数为将进程挂起,然后等待信号。

3:因为alarm函数在定时器到点的时候产生的信号默认为让该进程退出。因此本代码运行5秒然后直接退出,终端不会输出printf中的语句。

tips:挂起和阻塞的区别为,挂起是进程主动行为,阻塞是进程的被动行为。

*************************************/

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char *argv[])

{

int ret

ret=alarm(5)

pause()

printf("will this be printed?\n")

}

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main()

{

int ret

ret=alarm(5)

pause()

printf("I have been waken up.\n",ret)

}

你的想法对于单一进程是行不通的,因为一旦进程“阻塞”了,变量的值又怎么可能自己改变呢?

如果你谈的是多进程(或线程),那有很多方法可以使用。但恐怕你不是在进行多进程编程,因为这是多进程编程的最基本概念。如果连这些都未掌握,你根本没办法进行下去,更不用设计什么变量i变量j的了。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存