免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cascle
打印 上一主题 下一主题

怎么样才能传多个参数给signal函数的回调函数? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-05-06 22:07 |只看该作者
靠,明明是unix/linux论坛,某些傻比整天拿它娘了个逼的windows的来吓鸡巴显摆!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
12 [报告]
发表于 2010-05-06 22:15 |只看该作者
本帖最后由 OwnWaterloo 于 2010-05-06 22:16 编辑

回复 11# unistd

不懂就滚蛋, 少j8丢人现眼。

有段时间没骂你了, 皮痒了是不是?

论坛徽章:
0
13 [报告]
发表于 2010-05-06 22:22 |只看该作者
大伙别伤和气啊,这是共同交流进步的地方,都是有素质的牛人,没必要这样  

论坛徽章:
0
14 [报告]
发表于 2010-05-06 22:23 |只看该作者
回复 10# OwnWaterloo


    每次看到你的代码,都让我很惭愧,为什么我看不懂......

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-05-06 22:31 |只看该作者
回复 13# pengjianbokobe

论坛本应该这样, 但就有不是来交流的存在。

11楼就是一例, 看见Windows和C++就开始显示他的嘴巴有多么臭。
球本事没有,


需要可执行内存。 你把平台相关调用替换成你系统上相同功能的跑跑看就知道了。

如果你的系统没有VirtualAlloc, VirtualProtect或者 mmap, mprotect, 请通报一声~
可以继续尝试:
1. 直接用栈上的
2. 用malloc/ new分配, 可能会有可执行权限

论坛徽章:
0
16 [报告]
发表于 2010-05-06 22:49 |只看该作者
man 2 sigaction   ?

论坛徽章:
0
17 [报告]
发表于 2010-05-07 00:19 |只看该作者
回复 1# cascle


    可能楼主没有搞懂信号是做什么的.我说下我的理解。信号就好像系统的中断一样,中断是向系统报告外界发生了什么,需要处理。
    信号往往是通报给进程周外发生了什么。可能是进程违规访问她地址空间之外的内存,计算除零这一类是与系统的异常相关的,要不就是
    同步进程用的,比方两个进程之间用信号同步,进程访问速度比较慢的外设被挂起等待,数据到了,驱动程序告诉进程醒了吧,去工作。
    所以可以看出,信号到来就像系统中断一样让进程不可预知在什么时间发生。
    再说一下callback,这个就是由于进程不知道什么时候该调用信号处理函数,把她交给OS处理,信号到了,就帮我调用相应的信号处理函数,
    所以说参数是OS给进程的,那么能不能给些参数(注册是我给你(OS),到时候你再给我),这个是能办到的。有没有必要?如果有会带来什么
    问题?我觉得设计系统调用那帮人认为是没有必要的,信号可以发生多次,难道每次之前都要重新注册参数?这个可以办到(在信号处理函数中注册)
    但是没有必要这样去做,就像上面有人说得那样,完全可以用用户空间的全局变量去做,这样也可以减轻内核内存空间的压力。
    那么需要什么参数,一个进程可以接受64个信号,我们只可能希望OS告诉我,是发生了那个信号(这个又有点像中断了,不是吗那么多共享同一条irq线,到底是那个
    设备那??)所以我们就是需要一个参数信号序号,来解中断服务程序注册的应该能知道。还有没有别的信息了那。当然有就是siginfo数据结构描述的一些信息(自己查)
   
    也有这样一种情况,应用程序自己调用信号处理函数,跟像搂主的需求,这样似乎,用搂主的函数跟好些,为什么不用全局变量传参数?
    大家大概都了解信号处理函数往往要求是可重入的吧??全局变量要可重入是不是要求互斥访问那??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2010-05-07 03:26 |只看该作者
就楼主这次的这个需求来讲,16 楼给出的 sigaction 是唯一可行的办法。
从一般地语言特性角度来说,由于 C 语言没有 partial application,因此是不能够随意改变回调函数的参数个数的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
19 [报告]
发表于 2010-05-08 08:59 |只看该作者
来个极简化版本:需要获得一块内容同layout的可执行内存。 方法有很多。
然后在这块内存上弄来弄去, 最后 ...
OwnWaterloo 发表于 2010-05-06 21:33


    理论上可行, 但实际应用未必,  毕竟信号总是不知道什么时候发生, 你怎么可能预先设置人为丢在栈上的参数, 话说总是走这种人造调用栈的路有意思吗

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
20 [报告]
发表于 2010-05-08 10:21 |只看该作者
回复 19# zylthinking

没看见callback是自己调用的, 而不是传递给什么信号处理啊?
难道setvbuf你也只会自己搞一个栈上传递给它吗?
要传递给一个不知道什么时候调用的函数, 不会动动脑筋, 动态创建啊?
demo演示的重点都抓不出……

不要问我这种技术有没有意思, 去问问当初设计这些回调签名的人, 为什么不带用户参数。
因为当时全局变量很风行? 所以不需要考虑扩展性?

不是因为这些糟糕的回调签名, 我才懒得去搞这种左道玩意。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP