当前位置:  技术问答>linux和unix

请问在程序中调用signal()进行注册的时候,注册的过程是怎样实现的

    来源: 互联网  发布时间:2016-02-27

    本文导语:  最近在看linux0.11,有这么个问题,希望大家解答。 我想问的是在程序中出现signal()函数的时候,是不是仅仅只是注册这个函数,而当程序往下执行而发出信号的时候,这个时候才发生int0x80中断从而进行调用sys_signal和d...

最近在看linux0.11,有这么个问题,希望大家解答。
我想问的是在程序中出现signal()函数的时候,是不是仅仅只是注册这个函数,而当程序往下执行而发出信号的时候,这个时候才发生int0x80中断从而进行调用sys_signal和do_signal函数?另外,注册这个过程是怎样实现的?

为了表述的更清晰一些,我在网上找了个例子来说明,如下:

int main() 

 /* 进程号 */ 
 pid_t pid; 
 /* 想用信号?那先对信号处理函数进行注册,对应起来 */ 
 signal(SIGCHLD, handler); 
 /* 程序在这里“分叉”,新的进程创建了 */ 
 pid = fork(); 
 /* 通过fork()的返回值来判断是父进程还是子进程 */ 
 switch(pid){ 
   /* 返回 -1,很不幸,创建进程失败了。可能是没有足够的内存空间,也可能已经开起了太多的进程。 */ 
   case -1: 
     perror("forkn"); 
     break; 
   /* 返回 0,现在是在子进程里运行,那就调用子进程的操作函数。 */ 
   case 0: 
     /* 一个运行65535次的循环,如果你的机子太快,不能看清楚两个进程同时运行的效果,那就再加大循环次数。或用sleep()函数 */ 
     big_loop(FAC_N); 
     /* 取得子进程的PID,你可以看清楚子进程和父进程的PID是不同的(子进程的PID比父进程的要大,因为是在父进程运行后才创建的)。*/ 
     printf("PID:%dn", getpid()); 
     /* 子进程执行完了,发送信号 SIGCHLD。由于前面对这个信号进行了注册,这时就会转入信号处理操作。 */ 
     break; 
   /* 哈哈,返回的即不是错误,又不是子进程,那就是父进程喽。*/ 
   default: 
     /* 这里让用户输入了4个数 */ 
     input_information(); 
     /* 取得子进程的PID。*/ 
     printf("PID:%dn", getpid()); 
     break; 
 } 
 exit(0);   



请问是不是在

 /* 想用信号?那先对信号处理函数进行注册,对应起来 */ 
 signal(SIGCHLD, handler); 

这里的时候还没有进行int0x80的系统调用,这里仅仅是注册?那注册如何实现和完成的?


而在

     /* 子进程执行完了,发送信号 SIGCHLD。由于前面对这个信号进行了注册,这时就会转入信号处理操作。 */ 

这个地方才触发了真正的signal的系统调用的?

非常希望大家能回答我的问题,不甚感激

|
按我的理解,用户态的signal()执行后会调用核态的sys_signal(),并把信号处理函数以及其他信息添加到当前进程的struct task_struct的sigaction[]中,此时不会触发实际的信号处理函数。

信号的处理的一个很重要的入口在system_call.s的ret_from_sys_call(系统调用返回时)中,在发现有信号pending(且未被block)时,此时会调用do_signal(),将信号处理函数插入到用户态堆栈中,在系统调用返回后会立即执行信号处理函数。

|
1). 首先signal就是int 0x80实现的,没有更多的功能,就是添加进程的signal_handler
2). Linux属于内核非抢占调度,也就是说内核态不主动让出CPU,schedule没有办法切换进程的,只能在用户态抢占(通过中断/异常进入内核态并完成重新调度的)
3). 信号的处理是在从内核态到用户态切换之前完成的,比如中断/系统调用处理完毕之前:此时为了返回用户态的寄存器(这是由int 0x80导致的并保存在内核态堆栈的),会调用ret_from_intr/ret_from_syscall/ret_from_exception, 这三个函数都会检查有没有pending的signal,如果有,就调用do_signal(),当然这比较复杂,因为signal_handler属于用户态的空间,所以内核要在user->stack上面建立frame,然后再回到内核态,最终返回系统调用/异常。
4). pending signal是由发送方调用kill(),这个系统调用同样进入内核态,找到信号的收者,并把这个信号添加到接受者进程的signals,并且如果不被blocked,设置pending signal标志。这样接受者进程如果有机会得到执行,从内核态回来之前肯定会发现这个信号的,转到3执行就好了。

==========================
aria(*nix learner)说得对

up

|
分三步
第一步,注册信号处理函数,这个过程要在内核中记录处理函数的地址
第二步,其它进程或内核或自己递送信号,其实也是在内核中作个标记,意思是说发生了某个信号
第三步,从系统返回用户空间之前执行信号处理程序

    
 
 

您可能感兴趣的文章:

  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问在jsp中调用外部的类,与jsp调用javabean有何区别??
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 请问Java可否调用MsSQL的存储过程,如何调用?
  • 请问jsp可以调用EJB吗?
  • 请问这个方法如何调用?
  • 请问在jsp中如何调用ActiveX控件啊!求救
  • 请问:如何调用抽象类的方法
  • 请问make是如何调用gcc的啊
  • 请问.ini文件的格式及调用
  • 请问gcc有没有类似GetExitCodeProcess的函数,可以获得调用的外部程序的返回值呢?
  • 请问如何用jni类来调用一个非java写的外部exe?谢谢!
  • 请问高手:我想用applet调用一个本地的exe。怎么办?
  • 请问java如何调用com?请大家发表意见和指点一下。
  • 请问:make 嵌套调用,变量如何向下传递 3 级?
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • 请问如何在一个JSP页面调用一个exe程序呢?谢谢!
  • 请问有没有和DU或DF对应的系统调用?
  • 请问如何在web页面调用word,并将所有的所有表单参数调的word中排版、打印。
  • 请问JDBC中返回结果参数的存储过程{?=call 过程名(?,?,...)}返回的结果如何得到?
  • 请问各位大侠怎样在java中调用存储过程和接受存储过程的返回参数
  • 请问jsp怎么调用后台的存储过程?
  • 请问怎样在informix中建立存储过程并在esql/c中调用?
  • 请问怎么在java的控件里画条线?思路,过程?谢谢
  • 请问大侠如何把linux安装过程中的画面保存下来?
  • 请问 ubuntu下怎么编译gcc,谁有详细的过程,能否说一下
  • 请问下..UNIX成组链接策略的过程..
  • 请问一般JAVA BEAN的开发过程是怎样的?(100分,在现等待,马上送)
  • 请问在linux下生成“Hello World" 程序并运行的详细过程
  • 请问listen函数的执行过程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问什么时候发出SIGKILL信号、什么时候发出SIGTERM信号?
  • 我在安装 redhat7.2 的时候选择了 GNOME 界面,启动的时候选择了图形界面启动,请问如何更改?
  • 请问一下,安装FreeBSD的时候,我得键盘和鼠标都是USB口的,安装的时候找不到鼠标和键盘怎么办?急!
  • 为什么我在安装linux9的时候,机器检测硬件的时候,出现“超频保护中”的提示,请问大家有没有碰到此类的问题
  • 请问vsftp那里下载东西的时候提示输入密码怎样去掉呢?
  • 请问大家在写jsp代码的时候都用什么编辑器?
  • 用Redhat7.3下的Emacs,请问调试编译程序的时候,有无象msdn那样的东西
  • 请问redhat9.0下怎么在启动的时候直接进入命令行方式而不是xwindows方式??谢谢
  • 请问red hat 多少版本以后安装的时候可以装在硬盘任何柱面以后的分区。
  • 请问linux下半部处理的时候是否要关闭中断?
  • 各位,请问一下,我在第一运行JBuilder的时候,它向我要Login name和password应该怎么输入呀?
  • 在solaris8上编译完成,链接的时候出现Segmentation Fault - core dumped这种错误,请问是什么原因??
  • 请问怎么可以让程序出segment fault 的时候自动生成core 文件? 以前习惯调试core ,现在怎么突然没有了?
  • 请问读/proc/stat的时候是否需要加锁,会不会读到错误数据?
  • 我装LINUX时候选择开机字符界面,而且进入KDE,请问怎么进入GNOME呀
  • 请问:我要链接哪些oci库才能成功编译.我在编译的时候老是报OCI函数找不到.
  • 请问在linux中,怎样在进入目录的时候自动设定一些环境变量?
  • 请问linux里面的六个虚拟终端是不是在安装的时候就默认有的
  • 请问怎么样才能在两个组串比较的时候对大小写不敏感呢?
  • 请问:使用RMI的时候如何知道对方的IP地址?(zhoudan)
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3