免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
41 [报告]
发表于 2010-05-09 02:48 |只看该作者
本帖最后由 OwnWaterloo 于 2010-05-09 02:49 编辑
别以为就你懂汇编或者在这里就说机器指令吧, 也别觉得你写的是天书
zylthinking 发表于 2010-05-09 02:32


我可没有这么认为, 事实上我是将那段代码尽可能写得容易理解, 才弄出一个layout。
如果搭配的注释也一并附上, 绝对不是天书代码。
你可以去网上搜一下类似的其他代码, 看看我写的到底算不算丑陋的代码。

之所以没有附上注释, 是因为bbs的code有列数限制, 附上了之后排版乱了反而什么都看不清楚。

而你为什么会觉得我自认为自己写的是天书, 这就是你的心理了。

懒得较真而已, 因为我觉得我猜出你是的那堆数字是想干什么了而已
zylthinking 发表于 2010-05-09 02:32


再次暴露了你自以为是, 自欺欺人的态度。
不懂要装出不屑懂, 拿猜测当事实。

谁说你觉得只有你的是唯一方案了? 自己回去翻帖子, 然后凭良心说话是不是我编辑掉了。
zylthinking 发表于 2010-05-09 02:32

29楼已经被我拍照, 自己去看引用文字最上面。

然后凭良心说话, 那话是不是你打的, 是不是我故意编辑上去的。

我一开始说的什么, 只是觉得使用机器指令从中做把戏没太大意思而已, 你的代码有什么啊, 不就是人为在数据段造调用栈, 然后转化成代码执行吗, 之所以能在栈上出现第二个参数, 虽然没细究到底怎么做的按排, 原理逃不脱在你的那几个0xcc中硬赋值。

你怎么回答的, 抓不住重点, 好, 我是没考虑你用它干什么, 只是觉得一般回调函数你这样没用,

int callback(){
return 0;
}

void func(callback){
      你的二进制代码hack
}

你能保证 callback 函数能进去吗, 或许你修改以下能进去, 但现在你的几个硬编码数字不像有这个功能, 怎么了, 说错了吗, 你回帖什么态度, 骂人, 靠, 气得我简直冒火

zylthinking 发表于 2010-05-09 02:32


你回帖态度很好是不是?

你觉得没多大意思?你觉得这样没用? posix扩充C标准库中的类似功能是为什么?
你觉得原理掌握了? 你觉得不像有这个功能? "说错了吗"? 那还就是说错了。

我就是看不起你这态度。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
42 [报告]
发表于 2010-05-09 03:04 |只看该作者
本帖最后由 OwnWaterloo 于 2010-05-09 03:05 编辑
你既然承认是一个类似循环的东西就好了, 你可以说我装不屑懂, 反正我猜对了, 那么是不是 signal handler在OS机制中只能替换不能add也可以说我有对没把握的东西没有胡说八道了?
zylthinking 发表于 2010-05-09 02:38


我反驳过你这句话吗?  我说了可以替换吗?

拿一个我明明没有说的东西, 来装得你很正确, 你很无辜, 偷换概念。
其他的问题呢?

你怎么可能预先设置人为丢在栈上的参数
zylthinking 发表于 2010-05-08 08:59


这是你展现你乱说的开始。

我是为了做一个demo:
短小、 所有代码可见没有任何隐藏、 可编译运行、可查看结果展示可行性
所以才选择了自己去调用closure。

你根本就没看懂代码演示的目的。
栈对象在函数返回后会回收, 信号发生机制时间不定, 这是重点吗? 你以为只有你才懂? 用得着你来提醒?

是否要真的它用signal注册, 然后去rasie, 你才看得懂代码是干什么的?

不是动态参数, 是静态的, 那干嘛不用全局变量呢, 全局变量很丑陋是吗, 全局变量不是面向对象是吗, 你的代码不客气的说比全局变量丑陋的多。zylthinking 发表于 2010-05-08 14:04

还有你的机器代码, 你的是 x86 呢还是 arm 呢; 好歹要加上 #ifdef #else ................ #endif 吧?zylthinking 发表于 2010-05-08 14:04

而写出这样的代码的你, 说不定也YY 自己的本事可真不小(有些恶意了啊, 不好意思); 要用在实际编码上, 我先妄下断言, 事倍功半。zylthinking 发表于 2010-05-08 14:04


这些话又是谁说的?

如果你写一段代码, 我根本就不去细看,不去体会用意专挑各种乱七八糟的毛病
最后指出:
你的代码很丑
你YY的本事不小
你事倍功半


你作何感想?

论坛徽章:
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
43 [报告]
发表于 2010-05-09 03:27 |只看该作者
而你为什么会觉得我自认为自己写的是天书, 这就是你的心理了?
看三十五楼, 关于我的脑袋理论, 自己去找我为什么这么想的原因?

那一句, 好吧, 是我说的, “你以为只有你的能实现” 大概的意思吧, 那么, 你去看你那个大红字写着的“你实现个某某给我看”, 也大概是这个意思, 哦, 我不能实现是吧, 那你以为的大概不是自己的是唯一的实现, 而是以为的我这样的脑袋就是不够实现的了? 或者别的, 你补充补充?? 我确实没实现, 原来还要求什么什么式

你的态度可真够好的。
看不起我的态度, 爱看不看, 说白了我又不欠你钱。

"说错了吗"? 那还就是说错了
那么就是说那个回调能进去了? 可能是我错了, 我可以测试一下, 不过想来你所谓的返回函数地址是你自己硬编码的layout, 然后将这个layout地址传到signal, 然后信号机制肯定会直接调用layout了, 哦, 你还有一个handler, 这个layout肯定会进入handler的, 说来说去, 啊, 你代码中没有我所说的那个情景, 也没有我说的那个回调, 你还能调进去概念中从没有出现的东西?  你不会将你的handler当成我说的那个回调了吧, 自己琢磨琢磨吧, 如果我猜着了, 不求甚解的也就摆脱别看不起了。

没给注释还要人要看懂二进制, 没看懂还说我本来是要给的, 所以你不看懂就是不求甚解。。。。。。。。。。恩, 还有关于脑袋的问题, 看不明白二进制。。

算了, 我去睡觉了, 没意思, 对了, 我猜的是肯定错了, 你那几个数字干什么了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
44 [报告]
发表于 2010-05-09 03:48 |只看该作者
本帖最后由 OwnWaterloo 于 2010-05-09 03:49 编辑
而你为什么会觉得我自认为自己写的是天书, 这就是你的心理了?
看三十五楼, 关于我的脑袋理论, 自己去找我为什么这么想的原因?zylthinking 发表于 2010-05-09 03:27

没给注释还要人要看懂二进制, 没看懂还说我本来是要给的, 所以你不看懂就是不求甚解。。。。。。。。。。恩, 还有关于脑袋的问题, 看不明白二进制。。
zylthinking 发表于 2010-05-09 03:27


demo的目的是为了演示可行性。 设计实现那是之后的事。

有一个可以演示可行性的结果(输出 1212 326) 给你看你不愿意去体会,  非要去弄清楚实现。
弄不懂, 又说是天书, 又说是丑陋, 还胡乱批判一通。

怪谁?

那一句, 好吧, 是我说的, “你以为只有你的能实现” 大概的意思吧, 那么, 你去看你那个大红字写着的“你实现个某某给我看”, 也大概是这个意思, 哦, 我不能实现是吧, 那你以为的大概不是自己的是唯一的实现, 而是以为的我这样的脑袋就是不够实现的了? 或者别的, 你补充补充?? 我确实没实现, 原来还要求什么什么式zylthinking 发表于 2010-05-09 03:27


这是为了向你说明: 绑定全局与partial application的区别。
谁让你这么不开窍呢, 用说的不明白, 让你摔两跤总该明白了吧?
   

"说错了吗"? 那还就是说错了
那么就是说那个回调能进去了? 可能是我错了, 我可以测试一下, 不过想来你所谓的返回函数地址是你自己硬编码的layout, 然后将这个layout地址传到signal, 然后信号机制肯定会直接调用layout了, 哦, 你还有一个handler, 这个layout肯定会进入handler的, 说来说去, 啊, 你代码中没有我所说的那个情景, 也没有我说的那个回调, 你还能调进去概念中从没有出现的东西?  你不会将你的handler当成我说的那个回调了吧, 自己琢磨琢磨吧, 如果我猜着了, 不求甚解的也就摆脱别看不起了。
zylthinking 发表于 2010-05-09 03:27


你还是猜错了。 那几个0xcc只是占位符。
对应的指令是int 3。
如果占位符没有被替换的情况下被执行, 会引发调试中断, 可以用作debug。

第1个指令就是pop, 会将返回地址弹出到结构体的后部分 —— 所以返回地址根本不是硬编码
像你那样的硬编码的代码, 我可不好意思拿出来show。

第2条指令将arg 压入栈中。 这时候对callee来说, 参数就准备好了。

第3条指令调用callee, 同时会压入返回地址, 也就是结构体的剩余部分。

当callee返回后, 下一条指令就是修改栈顶。
而赋值给栈顶的值, 就是第1条指令被pop出的值。
所以, 最后一条指令正确地返回到caller, 而不是什么硬编码。

同时弹出一个返回地址。
余下的参数部分使用的栈空间, 就交给caller调用出余下部分代码处理。


没说你不求甚解是错的。 对次要问题不求甚解是可行的。
没说你不可以猜, 甚至你猜错了也无妨。
但你居然可以从自己的猜测出发作出批评 —— 而且是在完全猜错的情况下 —— 真有你的!

论坛徽章:
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
45 [报告]
发表于 2010-05-09 03:50 |只看该作者
我反驳过你这句话吗?  我说了可以替换吗?

拿一个我明明没有说的东西, 来装得你很正确, 你很无辜 ...
OwnWaterloo 发表于 2010-05-09 03:04



好吧好吧, 我有错误, 向你道歉。
这些确实我没细想, 原因比较单纯, 我所站立的角度就是楼主那篇帖子小小的范畴, 没考虑到posix那么多_r函数上去, 在我看来, 一个算是比较小的功能又要机器码又要什么的, 可以称为丑陋了, 也算是事倍功半吧; 至于小小恶意, 是我第一篇帖子惹你老人家怒了, 回帖有点攻击性的一个小小回应而已。。。。。。。。。。。。。。。。。

话说回来, 你怎么就没有反驳过那句话, 看这句:

你以为我会像你一样? 对完全没把握的事也敢乱说?
摘自29楼

我现在不想互相指责并表明自己多么无辜了, 给你不快不好意思, 向你道歉, 不过你也不是省油灯, 我也够气的。
现在只想知道你那几个数字是干了什么, 不好意思, 还是不想一个一个查指令。

论坛徽章:
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
46 [报告]
发表于 2010-05-09 03:55 |只看该作者
OK, 睡觉了, 88

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
47 [报告]
发表于 2010-05-09 04:23 |只看该作者
这些确实我没细想, 原因比较单纯, 我所站立的角度就是楼主那篇帖子小小的范畴, 没考虑到posix那么多_r函数上去, 在我看来, 一个算是比较小的功能又要机器码又要什么的, 可以称为丑陋了, 也算是事倍功半吧;
zylthinking 发表于 2010-05-09 03:50


我站的角度也是lz的问题。
你说的较小的功能这么费劲没假。 你是从实现者角度来考虑的。

如果借助库呢? 如果借助编译器扩展呢?
或者按你的逻辑, 只要一个库或者一个编译器扩展没逼得你不得不用,可以通过其他方式绕过去, 它们就是丑陋的, 事倍功半的?


话说回来, 你怎么就没有反驳过那句话, 看这句:

你以为我会像你一样? 对完全没把握的事也敢乱说?
摘自29楼
zylthinking 发表于 2010-05-09 03:50


我指的不是在OS层面signal可以add。

看42楼, 对你乱说的总结。
以及44楼, 看你是否想错了。


至于小小恶意, 是我第一篇帖子惹你老人家怒了, 回帖有点攻击性的一个小小回应而已
zylthinking 发表于 2010-05-09 03:50


从19楼我就觉得你是来找茬的。
实际操作中肯定要保证callback的生命周期不会短于callback的使用周期。

从22楼我就肯定你是来找茬的。
居然说是静态的, 和全局一个性质, 居然要写#ifdef ……

so, 一下子就来了火气。
我也错了  


实际代码中注释肯定是完备的。
#ifdef 要看最终是否打算做非i386的。 而且即使做非i386的, #ifdef也不会被加在实现代码中。
静态肯定是误解。 做这个的目的就是为了避免在和legacy designed的callback作斗争时使用静态数据作为context, 从而避免静态数据的诸多问题。
内存分配、 类型检查(这就是C++ only了, C没什么好办法)都是有的。

能将最核心的代码压缩到40行已经很不容易了……

论坛徽章:
0
48 [报告]
发表于 2010-05-09 08:35 |只看该作者
signal的处理函数中很多限制,只能用全局变量来处理,没有办法传递另外的参数。

sigaction那一组函数也不行,唯一的办法是用全局变量。

论坛徽章:
0
49 [报告]
发表于 2010-05-09 09:16 |只看该作者
学习

论坛徽章:
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
50 [报告]
发表于 2010-05-09 13:43 |只看该作者
本帖最后由 zylthinking 于 2010-05-09 14:02 编辑
我站的角度也是lz的问题。
你说的较小的功能这么费劲没假。 你是从实现者角度来考虑的。

如果借助库 ...
OwnWaterloo 发表于 2010-05-09 04:23


根据你说明和乱猜, 估计你的机器码大概是这个意思:

      unsigned char layout[] = {
            0x8f,0x05,      0xcc,0xcc,0xcc,0xcc,
            0x68,           0xcc,0xcc,0xcc,0xcc,
            0xe8,           0xcc,0xcc,0xcc,0xcc,  
            0xc7,0x04,0x24, 0xcc,0xcc,0xcc,0xcc,
            0xc3,   
      };

     callback(326);
     return 0;

// callback 326

push 326
push &(return 0)
            
// 0x8f,0x05,      0xcc,0xcc,0xcc,0xcc,
pop &(return 0) to &layout[19]

// 0x68,           0xcc,0xcc,0xcc,0xcc,  
push context

//  0xe8,           0xcc,0xcc,0xcc,0xcc,  

push &layout[16]
jump handler

// 0xc7,0x04, 0x24, 0xcc,0xcc,0xcc,0xcc,  
move &(return 0) to &layout[02]

// 0xc3
ret

如果没错的话, 昨天其实一开始就大体猜对了, 只是具体怎么安排的调用栈没明白。
分歧在哪里呢, 说白了就是我觉得无所谓这么麻烦, 而你呢, 因为有现成的代码, 似乎有, 我不信你那个signal_add就是因为和我吵架专门弄出来的, 有现成的机制, 自然, 你的机制是解决其他大麻烦的, 但我其实没那么多信息量, 只关心小小的signal; 于是认为我攻击你的机制不完备上去了。

我根本没有说你这段代码的还有什么生存期问题, 更没有说你的函数返回地址是硬编码。
我说的静态参数是什么意思?
是你的context一旦推到栈上, *context 你没办法自动赋值。

所以, 调用者要从 context 中获益, 也只能实时更新 context 指向的内存的内容;
说白了, 也只能这样调用 context->X = XX; raise(SIGXXX);
和全局变量绑定没什么区别。 bind[SIGXXX] = XX; raise(SIGXXX);, 或者干脆bind[SIGXXX]  = context;  context->X = XX; raise(SIGXXX);
确实, 你的实现有contex1, context2 分别绑定到 handler 的优势, 然而signal 却只会绑定你其中一个 layout,  自然, 你可以在handler中作逻辑, 弄出一个signal_add来, 但这和我现在说的是两回事。
所以, 我才在26楼说: 既然闭包了老半天, 似乎高深莫测, 我偏偏还是愚钝, 还是老问题问你, 你的实现比我上面贴出的代码优点在哪里?

说到底, 我们两个都没有搞清楚对方到底要说什么, 呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP