免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2881 | 回复: 7
打印 上一主题 下一主题

[函数] signal函数的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-10 23:19 |只看该作者 |倒序浏览
举个例子
int main(){
        signal(SIGINT,sig_int).........

         while(1){
               ...................
               ...................
         }
}

首先我知道siginal函数的作用是
程序正在前台运行,你又突然按了下ctrl+c 强制退出,那么程序正在运行 的时候可能就被干掉了。而 trap 或者siganal 函数就可以让你在某种不正常退出的情况下,再调用你指定的函数,可以做些清理工作啊什么的。

但是我想知道,现在再main()开始的时候调用的这个siginal函数 ,现在当程序执行到while()里面的时候,收到ctrl+c的信号,是怎么回去调用siginal函数的呢?

问题可能比较白痴,希望各位高手多多见谅!!!!

[ 本帖最后由 bladmin 于 2009-4-10 23:32 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-10 23:29 |只看该作者
ANSI/ISO C 绝对不是“跨平台”的,就是因为 siginal 系列函数的实现太 OS 相关了。

论坛徽章:
0
3 [报告]
发表于 2009-04-10 23:33 |只看该作者
原帖由 MIPSProcessor 于 2009-4-10 23:29 发表
ANSI/ISO C 绝对不是“跨平台”的,就是因为 siginal 系列函数的实现太 OS 相关了。


我没有跨平台的意思。现在我把上面的问题改了下,把下面的执行部分改为了一个while循环!不知道我的意思说明白了没有!不好意思!

论坛徽章:
0
4 [报告]
发表于 2009-04-10 23:48 |只看该作者

回复 #1 bladmin 的帖子

进程表里保存了siginal函数的地址,ctrl+c产生一个中断设置信号位,中断返回时系统检查到有信号置位就构造一个环境,调用siginal函数

论坛徽章:
0
5 [报告]
发表于 2009-04-11 16:31 |只看该作者

回复 #4 ipole 的帖子

多谢多谢!明白了!:wink:

论坛徽章:
0
6 [报告]
发表于 2009-04-11 16:39 |只看该作者
应该 信号处理函数仅当程序返回到用户态时才有可能执行 这是很显然的 呵呵

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2009-04-11 17:09 |只看该作者
当收到SIGINT信号的时候,不是调用了signal函数.
signal函数动作是,告诉系统,如果该进程收到了某种信号,就按signal函数指定的函数或者动作去处理这个信号.
于是调用以后,系统就知道了,以后遇到这个信号,就这么处理.
另外,不要用signal函数,应该改用sigaction系统调用.

论坛徽章:
0
8 [报告]
发表于 2009-04-13 11:29 |只看该作者
原帖由 bladmin 于 2009-4-10 23:19 发表
收到ctrl+c的信号,是怎么回去调用siginal函数的呢?


为了给进程发送信号,内核根据信号的类型来设置进程表项的信号字段的某一个位。如果进程处于可中断的睡眠,则内核将唤醒它。需要注意的是,一个信号只会被设置一次。只有当进程从内核态返回用户态的时候,内核才会处理信号。由于进程需要处理信号之前可能是从睡眠中被唤醒,或者从内核态返回用户态,进程并不知道收到了信号,因此需要检查是否有pending的信号。
……
为了使用户能够调用自定义的信号处理函数,在u area中包含了一个函数指针数组,数组中的每个元素对应一种信号的handler,handler的签名为:
void (*) (int);
选择在u area中保存这样一个数组是因为u area是内核能直接访问进程地址空间惟一的地方。内核与用户交换数据是另外一个话题,这里不多讲。这也就是为什么在内核调用自定义handler要做如此复杂的操作,而不是直接调用如:pTable[pid]->u_area->sighandler(sigNo)——因为u area中只保存了handler的地址,而不是整个handler的代码。而通过handler的地址是无法从内核中直接调用处在用户空间的 handler代码的。
……

更多信息请参考:[原]UNIX内核(15):进程控制2——信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP