Linux如何防止程序中断--screen

Linux如何防止程序中断--screen,第1张

在Linux或者服务器使用中,我们通常会有以下困扰:

1) 在跑大型数据的时候,一旦关闭会话窗口、软件、断网、断电等情况下程序出现异常中断

2) 现在暂停编写或者跑程序,一段时间后继续运行,希望继续运行时原先导入的变量还在

3) 目前的Shell软件限制开的窗口为5个,若是同时前台 *** 作的话举亩只能进行五个终端,同一终端使用多个会话是不行正慧森的

这些情况下可以使用screen命令解决 【离线 *** 作,保留工作环境,同一终端多个会话】 :

1. 构建一个新的会话,并命名为sessionName

screen -S sessionName   

可以发现构建之后,与创建会话之前没有任何差别,但是接下来我们所有的输入命令都在这个sessiion中

2. screen -ls

在任一个打开的窗口可以查看我们构建的session,其中会发现会话有以下形式组成

sessionID.sessionName    [状态(attached【在线】;detached【离线】)]

3. screen -r sessionName  除了使用会话名字还可以使用会话ID

重新连接会话

4. screen -d sessionName 或者在已经入的session中,按住Ctrl 不放,分别按 a d

离线连接的会话,这时候程序会放在后台运行,无需担心断电断网关机等各种突发状况

5. 假设在当前的sessionName中,我们可以使用 exit 退出并杀死当前session;或者 screen -S sessionName -X quit     

【一定要记得每个session跑完之后,需要Kill它】

6. 有时你发现采用 screen -r sessionName 发现显示没有这个会话,但是screen -ls的时候会发现这个会话明确是存在的,那么可以采取的策略是:

先 screen -d sessionName 这个会话,使其离线,然后再碧饥使用 screen -r sessionName将其重新连线

设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。

让CPU进行轮询等待总是不能让人满意,所以通常都采用中断的形式,让设备来通知CPU读取数据。

2.6内核的函数参数与现在的参数有所区别,这里都主要介绍概念,具体实现方法需要结合具体的内核版本。

request_irq函数申请中断,返回0表示申请成功,其他返回值表示申请失败,其具体参数解释如下:

flags 掩码可以使用以下几个:

快速和慢速处理例程 :现代内核中基本没有这两个概念了,使用SA_INTERRUPT位后,当中断被执行时,当前处理器的其他中断都将被禁止。通常不要使用SA_INTERRUPT标志位,除非自己明确知道会发生什么。

共享中断 :使用共享中断时,一方面要使用SA_SHIRQ位,另一个是request_irq中的dev_id必须是唯一的,不能为NULL。这个限制的原因是:内核为每个中断维护了一个共享处理例程的列表,例程中的dev_id各不相同,就像设备签名。如果dev_id相同,在卸载的迹镇桥时候引起混淆(卸载了另一个中断),当中断到达时会产生内核OOP消息。

共享中断需要满足以下一个条件才能申请成功:

当不需要使用该中断时,需要使用free_irq释放中断。

通常我们会在模块加载的时候申请安装中断处理例程,但书中建议:在设备第一次打开的时候安装,在设备最后一次关闭的时候卸载。

如果要查看中断触发的次数,可以查看 /proc/interrupts 和 /proc/stat。

书中讲述了如何自动检测中断号,在嵌入式开发中通常都是查看原理图和datasheet来直接确定。

自动检测的原理如下:驱动程序通知设备产生中断,然后查看哪些中断信号线被触发了。Linux提供了以下方法来进行探测:

探测工作耗时较长,建议在模块加载的时候做。

中断处理函数和普通函数其实差不多,唯一的区别是其运行的中断上下文中,在这个上下文中有以下注意事项:

中断处理函数典型用法如下:

中断处理函数的参数和返回值含义如下:

返回值主要有两个:IRQ_NONE和IRQ_HANDLED。

对于中断我们是可以进行开启和关闭的,Linux中提供了以下函数 *** 作单个中断姿猛的开关:

该方法可以在所有处理器上禁止或启用中断。

需要注意的是:

如果要关闭当前处理器上所有的中断,则可以调用以下方法:

local_irq_save 会将中断状态保持到flags中,然后禁用处理器上的中断;如果明确知道中断没有在其他地方被禁用,则可以使用local_irq_disable,否则请使用local_irq_save。

locat_irq_restore 会根据上面获取到flags来恢复中断;local_irq_enable 会无条件打开所有中断。

在中断中需要做一些工作,如果工作内容太多,必然导致中断处理所需的时间过长;而中断处理又要求能够尽快完成,这样才不会影响正常的系统调度,这两个之间就产生了矛盾旅蚂。

现在很多 *** 作系统将中断分为两个部分来处理上面的矛盾:顶半部和底半部。

顶半部就是我们用request_irq来注册的中断处理函数,这个函数要求能够尽快结束,同时在其中调度底半部,让底半部在之后来进行后续的耗时工作。

顶半部就不再说明了,就是上面的中断处理函数,只是要求能够尽快处理完成并返回,不要处理耗时工作。

底半部通常使用tasklet或者工作队列来实现。

tasklet的特点和注意事项:

工作队列的特点和注意事项:

Linux下强制中断一个程序的执行使用键盘按键可以有多种方法。

1、CTRL+C键,这相当游梁于发送Terminal信息到当前的程序。比如下图,在通过find命令查找名称带3b76的文件,神贺运可以直接按ctrl+c键结束掉循环。

2、CTRL+Z键,这是暂停键,暂停程序执行。可以再通过fg命令返回重新运行被暂停的程序。比如下图,在mysql中执行命令,这时候希望查询一下当前目录下的文件,就可以按CTRL+Z,然拍液后执行完ls命令后,再执行fg命令即可回到mysql中。

3、CTRL+D键,发送exit信号,退出程序,比CTRL+C要温柔一些,比如下图,退出phython3.5就可以按CTRL+D键。


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

原文地址: https://outofmemory.cn/yw/12297580.html

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

发表评论

登录后才能评论

评论列表(0条)

保存