`
longxj
  • 浏览: 101786 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

generate and deliver signal

阅读更多


在linux里,generate signal是指在接受信号的进程结构中插入信号的相关结构(在进程的结构中有两个跟信号相关的队列,一个是pending field里的信号队列,一个是signal field里的信号队列
其中pending指向的是进程的私有信号,而signal里的是进程所在进程组的共有信号)。这个结构名为struct sigqueue.需要补充说明的是,如果信号是被进程忽略的,忽略一个信号需要满足的3个条件是:
1.The process is not being traced (PT_PTRACED flag in t->ptrace clear).

2.The signal is not blocked (sigismember(&t->blocked, sig) returns 0).

3.The signal is either explicitly ignored (the sa_handler field of t->sighand->action[sig-1] is equal to SIG_IGN) or implicitly ignored (the sa_handler
field is equal to SIG_DFL and the signal is SIGCONT, SIGCHLD, SIGWINCH, or SIGURG).
那么是不会创建信号的结构的。如果因为某种原因比如内存空间不够,信号结构无法创建,但是仍然会更新sigpending结构里的signal field。这样是为了保证就算内存不够,也使得管理员可以杀死恶意的进程
,通过发送kill信号给它。
deliver signal是指linux让进程开始处理pending的信号。
在generate signal的最后,kernel会选择要进行信号处理的进程,将进程的状态设为TASK_RUNNING,如果进程本来就在运行,那么将会对进程进行reschedule,这样使得能尽快对进程信号进行相应。
因为只有从内核态返回用户态时,才会对进程的信号bit进行检查。如果信号是发给一个进程组的,那么kernel将会选择一个满足下面条件的进程来处理信号。
kernel在处理完中断和异常后,会检查即将运行的进程的信号bit,如果进程有信号要处理,会对进程的信号队列的信号进行处理。首先处理的是进程的私有信号队列,然后是进程的共有信号。具体处理的函数
叫do_signal(),函数里有一个loop,将会使得所有的信号都得到处理,但是有一点要注意的是如果进程为信号,设置了自己的处理函数,那么会导致退出do_signal()函数,代码示例:
handle_signal(signr, &info, &ka, oldset, regs);
if (ka->sa.sa_flags & SA_ONESHOT)
ka->sa.sa_handler = SIG_DFL;
return 1;
handle_signal是用来调用进程自己定义的信号处理函数。
所以Notice how do_signal( ) returns after having handled a single signal. Other pending signals won't be considered until the next invocation of
do_signal( ). This approach ensures that real-time signals will be dealt with in the proper order.
由于信号的到来会唤醒被阻塞的进程,有时进程的阻塞是因为系统调用的资源无法满足,在这种情况下,由于信号唤醒了进程,而信号处理完后,进程将继续运行(位于系统调用后的代码),使得进程之前
执行的系统调用没有运行完,这显然是不允许的。所以kernel在deliver 一个信号的时候会检查进程之前是否进行了系统调用,如果是的话,系统将会采用3种处理方法:
Terminate

The system call will not be automatically reexecuted; the process will resume its execution in User Mode at the instruction following the int $0x80 or sysenter one and the eax register will contain the -EINTR value.

Reexecute

The kernel forces the User Mode process to reload the eax register with the system call number and to reexecute the int $0x80 or sysenter instruction; the process is not aware of the reexecution and the error code is not passed to it.

Depends

The system call is reexecuted only if the SA_RESTART flag of the delivered signal is set; otherwise, the system call terminates with a -EINTR error code.

这里还有一点要提醒的是,reexecute有时不能只是将前面的系统调用重新调用一次,参数用前面的。比如如果之前调用的系统调用是sleep(3),那么由于时间可能已经过了2,那么reexecute的时候,
就应该这样调用sleep(1)。
2009/02/17 二







分享到:
评论

相关推荐

    generate_OFDM_signal_4.m

    generate_OFDM_signal_4.m

    Verilog中generate用法

    在Verilog-2001版本中,引入了`generate`语句,这极大地增强了代码的可读性和复用性,特别是在创建并行结构和根据条件实例化模块时。`generate`允许你基于变量或者条件来动态地创建模块实例、网线(net)、变量...

    codegenerate-3.6.1源码

    《codegenerate-3.6.1源码解析与二次开发指南》 在IT行业中,源码分析和二次开发是提升软件功能、优化性能的重要手段。本文将深入探讨"codegenerate-3.6.1源码",它是基于Jeecg框架的自动生成代码工具的源代码版本...

    Springer 2013 Signal Processing

    Presents analysis and synthesis methods to generate all circuit topologies from which the designer can select the best one for the desired application; Includes design guidelines for active devices/...

    codegenerate-3.6.1

    《深入解析Jeecg框架3.6.1的Codegenerate模块》 Jeecg框架,作为一款高效的企业级快速开发平台,一直以来深受开发者们的青睐。本文将深入剖析Jeecg框架3.6.1版本中的Codegenerate模块,帮助开发者更好地理解和运用...

    IDEA代码生成,Generate POJOs.proovy内容替换

    打开里面的内容,替换idea项目中的Generate POJOs.groovy文件(文件路径:SCratches and Consoles -> extensions -> Database Tools and SQL -> schema - > Generate POJOs.groovy)

    Generate Waveform VI(Labview)

    labview中找不到的generate waveform.vi Generate Waveform .VI程序 目录为activity\Generate Waveform.vi Labview8.5中的Generate Waveform VI labview 8.6中找不到generate waveform vi文件 labview中的一个自带的...

    CW_signal_cw_TheSignal_lfm_

    在本场景中,"Generate_CW_signal.m"文件很可能是用于生成基本的连续波信号的MATLAB脚本。 2. **线性调频(Linear Frequency Modulation,LFM)**: LFM是一种调制技术,它改变信号的频率随时间呈线性变化。这种...

    SQL and ADO Code Generator. Generate SQL statement and ADO C

    SQL and ADO Code Generator. Generate SQL statement and ADO Code Connection without the use of an ADO Data Control.

    MyBatis-Generate

    It will generate code for all versions of MyBatis, and versions of iBATIS after version 2.2.0. It will introspect a database table (or many tables) and will generate artifacts that can be used to ...

    codegenerate-1.0.4.jar

    codegenerate-1.0.4.jar

    Generate POJOs.groovy

    IDEA通过Generate.POJOs.groovy映射数据库自动生成对应的Java实体类, 具体逻辑不详细展示,可参考:https://blog.csdn.net/weixin_40375601/article/details/106807644

    Generate Waveform.vi

    Generate Waveform.vi

    Think.DSP.Digital.Signal.Processing.in.Python.1491938455_Early.Release

    Think DSP: Digital Signal Processing in Python is an introduction to signal processing and system analysis using a computational approach. The premise of this book (like the others in the Think X ...

    jeecg-mybatis-generate 源码

    《深入解析Jeecg-Mybatis-Generate源码》 Jeecg-Mybatis-Generate是一款基于Mybatis的代码生成工具,它极大地提高了开发效率,通过自动化的代码生成,减少了手动编写重复性工作,使开发者能够更加专注于业务逻辑的...

    MybatisGenerate_代码生成_tkMybatis_mybatisgenerate_mybatis_

    MybatisGenerate是一个强大的工具,主要用于自动化生成Mybatis相关的代码,以提高开发效率并减少手动编写重复性工作的负担。这个工具是基于tk.mybatis框架的,它整合了Mybatis的优秀特性,使得开发者能够更加便捷地...

    Verilog-generate语句的用法

    ### Verilog Generate 语句详解 #### 一、引言 Verilog HDL是一种硬件描述语言,被广泛应用于数字逻辑电路的设计与验证之中。自Verilog-2001版本开始,该语言引入了一个强大的特性——`generate`语句,这使得设计...

    signal-generator.rar_Generate Waveform VI_generator_labview_信号发生

    在这个"signal-generator.rar_Generate Waveform VI_generator_labview_信号发生"压缩包中,包含了一个名为"signal-generator.vi"的LabVIEW虚拟仪器(VI),它是一个信号发生器的源代码,能够生成正弦波、三角波、方...

    前端开源库-generate-js

    "generate-js"是一个专注于原型继承模型和生成器的前端开源库,它旨在简化JavaScript对象的创建和扩展,提高代码的可维护性和复用性。这个库的核心在于其强大的对象生成和继承机制,使得开发者能够更加高效地编写...

    codegenerate.zip

    这里,我们关注的是一款名为"codegenerate"的工具,它与Java编程语言密切相关。 “codegenerate.zip”是一个包含Java代码生成工具的压缩包,可能是作者个人使用的项目备份或学习资料。尽管它可能不是专门设计供他人...

Global site tag (gtag.js) - Google Analytics