在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
在Verilog-2001版本中,引入了`generate`语句,这极大地增强了代码的可读性和复用性,特别是在创建并行结构和根据条件实例化模块时。`generate`允许你基于变量或者条件来动态地创建模块实例、网线(net)、变量...
《codegenerate-3.6.1源码解析与二次开发指南》 在IT行业中,源码分析和二次开发是提升软件功能、优化性能的重要手段。本文将深入探讨"codegenerate-3.6.1源码",它是基于Jeecg框架的自动生成代码工具的源代码版本...
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/...
《深入解析Jeecg框架3.6.1的Codegenerate模块》 Jeecg框架,作为一款高效的企业级快速开发平台,一直以来深受开发者们的青睐。本文将深入剖析Jeecg框架3.6.1版本中的Codegenerate模块,帮助开发者更好地理解和运用...
打开里面的内容,替换idea项目中的Generate POJOs.groovy文件(文件路径:SCratches and Consoles -> extensions -> Database Tools and SQL -> schema - > Generate POJOs.groovy)
labview中找不到的generate waveform.vi Generate Waveform .VI程序 目录为activity\Generate Waveform.vi Labview8.5中的Generate Waveform VI labview 8.6中找不到generate waveform vi文件 labview中的一个自带的...
在本场景中,"Generate_CW_signal.m"文件很可能是用于生成基本的连续波信号的MATLAB脚本。 2. **线性调频(Linear Frequency Modulation,LFM)**: LFM是一种调制技术,它改变信号的频率随时间呈线性变化。这种...
SQL and ADO Code Generator. Generate SQL statement and ADO Code Connection without the use of an ADO Data Control.
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
IDEA通过Generate.POJOs.groovy映射数据库自动生成对应的Java实体类, 具体逻辑不详细展示,可参考:https://blog.csdn.net/weixin_40375601/article/details/106807644
Generate Waveform.vi
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是一款基于Mybatis的代码生成工具,它极大地提高了开发效率,通过自动化的代码生成,减少了手动编写重复性工作,使开发者能够更加专注于业务逻辑的...
MybatisGenerate是一个强大的工具,主要用于自动化生成Mybatis相关的代码,以提高开发效率并减少手动编写重复性工作的负担。这个工具是基于tk.mybatis框架的,它整合了Mybatis的优秀特性,使得开发者能够更加便捷地...
### Verilog Generate 语句详解 #### 一、引言 Verilog HDL是一种硬件描述语言,被广泛应用于数字逻辑电路的设计与验证之中。自Verilog-2001版本开始,该语言引入了一个强大的特性——`generate`语句,这使得设计...
在这个"signal-generator.rar_Generate Waveform VI_generator_labview_信号发生"压缩包中,包含了一个名为"signal-generator.vi"的LabVIEW虚拟仪器(VI),它是一个信号发生器的源代码,能够生成正弦波、三角波、方...
"generate-js"是一个专注于原型继承模型和生成器的前端开源库,它旨在简化JavaScript对象的创建和扩展,提高代码的可维护性和复用性。这个库的核心在于其强大的对象生成和继承机制,使得开发者能够更加高效地编写...
这里,我们关注的是一款名为"codegenerate"的工具,它与Java编程语言密切相关。 “codegenerate.zip”是一个包含Java代码生成工具的压缩包,可能是作者个人使用的项目备份或学习资料。尽管它可能不是专门设计供他人...