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将其重新连线

首先我阐明一下,用锁的情况只有两种:

线程

文件

内核程序在使用的时候也脱离不了这两种锁的概念。

中断,是信号,是否要处理中断信号?或者产生中断信号?

对信号来说只有:

信号屏蔽、信号捕捉、信号排队、可重如函数等概念。

你想问的问题,我没猜测,在处理某个信号时,不想让其他信号中断,那么使用信号屏蔽字:

先设置要屏蔽的信号集,要保存的信号集,初始信号集,可供协调使用的函数有几个:

#include <signal.h>

signal(这个不建议使用,应为有些老的实现是有问题的),设置信号处理程序

sig_atomic_t 数据类型

sigprocmask,设置信号屏蔽字

sigaction,设置信号处理程序,功能跟强悍,可控性更好

sigsuspend,以原子性方式,等待某些信号发生,然后返回

你具体要做啥不清楚,但使用上面的信号相关的函数,肯定能实现你的功能。参考APUE的论述。

FPGA每隔100us给运行linux的ARM一个中断,要求在20us内响应中断,并读走2000*16bit的数据。

目前主要的问题是,当系统同时发生多个中断时,会严重影响linux对FPGA中断的响应时间。如何解决?

1、首先想到了ARM的FIQ,它可以打断IRQ中断服务程序,保证对外部FIQ的及时响应。但是发现linux只实现了IRQ,没有显示FIQ。

linux是从devicetree读取中断号,加入中断向量表的。

interrupts = <0x0 0x32 0x0>中的第一个字段0表示非共享中断,非零表示共享中断,SDK产生的dts统一为0,此时第二字段的值比XPS中的小32;如果第一字段非零,则第二字段比XPS小16.

最后字段表示中断的触发方式。

IRQ_TYPE_EDGE_RISING=0x00000001,

IRQ_TYPE_EDGE_FALLING=0x00000002,

IRQ_TYPE_LEVEL_HIGH=0x00000004,

IRQ_TYPE_LEVEL_LOW=0x00000008,

很明显,devicetree根本没有提供通知linux有FIQ的渠道。

2、再来看linux的IRQ

linux的中断分为上半部和下半部,上半部运行在IRQ模式,会屏蔽所有中断,下半部运行在SVC模式,会重新打开中断。

也就是说,当一个中断的上半部正在运行时(不能再次响应中断),FPGA的中断是不能被linux响应的;

反过来,当FPGA中断的上半部正在运行时(不能再次响应中断),其他的中断也不能被linux响应;

unsigned long flags

...

local_irq_save(flags)

....

local_irq_restore(flags)

3.

ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。

我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin.

在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。

先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处于禁止状态。无论你在irq

pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了。

在I位和F位为0的时候,当irq

pin上有中断信号过来的时候,就会打断arm的当前工作,并且切换到IRQ模式下,并且跳到相应的异常向量表(vector)位置去执行代码。这个过程是自动的,但是返回到被中断打断的地方就得您亲自动手了。当你跳到异常向量表,处于IRQ的模式的时候,这个时候如果irq

pin上面又来中断信号了,这个时候ARM不会理你的,irq

pin就跟秘书一样,ARM核心就像老板,老板本来在做事,结果来了一个客户,秘书打断它,让客户进去了。而这个时候再来一个客户,要么秘书不断去敲门问,要么客户走人。老板第一个客户没有会见完,是不会理你的。

但是有一种情况例外,当ARM处在IRQ模式,这个时候fiq pin来了一个中断信号,fiq

pin是什么?是快速中断呀,比如是公安局的来查刑事案件,那才不管你老板是不是在会见客户,直接打断,进入到fiq模式下,并且跳到相应的fiq的异常向量表处去执行代码。那如果当ARM处理FIQ模式,fiq

pin又来中断信号,又就是又一批公安来了,那没戏,都是执法人员,你打不断我。那如果这个时候irq

pin来了呢?来了也不理呀,正在办案,还敢来妨碍公务。

所以得出一个结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。

在打不断的情况下,irq pin 或 fiq pin随便你怎么发中断信号,都是白发。

所以除了fiq能打断irq以外,根本没有所谓中断嵌套的情况。

Linux不用FIQ,只用到了IRQ。但是我们有时候一个中断需要处理很长时间,那我们就需要占用IRQ模式那么长的时间吗?没有,linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。

只不过SVC模式下的ISR上半部关闭了当前中断线,下半部才重新打开


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

原文地址: http://outofmemory.cn/yw/8264415.html

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

发表评论

登录后才能评论

评论列表(0条)

保存