免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
31 [报告]
发表于 2010-05-09 01:25 |只看该作者
本帖最后由 zylthinking 于 2010-05-09 01:38 编辑
回复  zylthinking

你依然没有理解partial application到底是怎么回事。



别搞笑了。
pa1->clos ...
OwnWaterloo 发表于 2010-05-09 01:14



去看我对该贴的最新的修改, 然后再写一篇, 免得我新旧夹杂, 看的眼痛

论坛徽章:
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
32 [报告]
发表于 2010-05-09 01:36 |只看该作者
本帖最后由 zylthinking 于 2010-05-09 02:02 编辑

废话, 写出一堆二进制代码让人看, 还想别人看懂? 早在22楼就告诉你了, 你的东西我压根没看懂, 不是看不懂, 不想去查0x123456代表什么指令, 那么如果我推测的构造栈 ,然后call 你的自己的handler有问题了, 有问题就说, 骂人吗, 靠, 谁不会?

还有, 就算我看不懂的也是你对栈的处理部分, 返回的是函数地址还看不懂, 你以为你写的是天书啊, 看看你的virtualprotect, 用屁股都能想到了。 返回函数地址, 做真正的 signalhandler, 然后利用之前在栈上按排的参数, 构造一个调用2参数版本的call stack frame, 然后调进去, 这就是我的猜测, 从一开始到现在一直就这么猜的。

返回类指针, 废话, 我又没有制造二进制代码, 在这之前我已经说了, 不在signal上为难你, 已经转到另一个场景了, 要还是signal场景, 我就用签面那个全局 bind数组来, 怎么啦, 比你的代码差? 屁话, 只是显得不如你的高深而已, signal 只能绑定一个处理函数, 怎么了, 有意见?



//===================================
你以为我会像你一样? 对完全没把握的事也敢乱说?
//====================================

靠, 先告诉你, 我还是没看懂, 还是懒得看, 不过看上去似乎是你自己在handler里面搞了一个类似循环的东西, 如果没说对, 就此打住别看了, 若我说对了, 请往下看: 有没有长脑子啊你, 看不懂我说什么吗, 不是你自己在你的代码里做处理, 看 OS 有没有排队。

在这个意义下, 你能绑定两个? 如果只有一个, 你引以为豪的所谓闭包有什么用? 我照样能用低级代码实现你所谓的 signal_add

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

你这种阳春白雪式代码, 我在newbie阶段都不会这么写。

你写的sig_add是侵入式的, 必须先注册, 才能add。

list context[MAX];
void list_handler(int s) {
      for each f in context[ s ]  :
           f(s);
}

signal(sig_xxx, list_handler);          << 必须先执行这个调用
sig_add(sig_xxx, hanlder1, context1 );

我实现的东西, 是一个真正的函数
虽然只是i386上的, 但因为i386是pc流行的平台, 我假设lz是问的这个。
不妨我们问问lz是否是用的i386发帖, 甚至, 你是否正在用i386发帖?

而非i386上实现一段相应的代码即可。
实现C+closure的编译器也是存在的。
你不会认为标准C语言可以完成任何事情吧
或者你不懂汇编? 连基本的调用规则都不懂?


另外, 我没说只有我的方案才可行, "只有"两字是你添加的。
反而是你一直在说我的方案不可行, 证据我就不列了, 只要你别编辑你的帖就是。
此外还一直在show你那些恶心的代码, 证据我也不列了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
34 [报告]
发表于 2010-05-09 01:47 |只看该作者
先告诉你, 我还是没看懂, 还是懒得看
zylthinking 发表于 2010-05-09 01:36


要将自己的不懂, 自己的无能, 伪装成不屑懂。
你就这么一直伪装下去好了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
35 [报告]
发表于 2010-05-09 01:50 |只看该作者
废话, 写出一堆二进制代码让人看, 还想别人看懂?
zylthinking 发表于 2010-05-09 01:36


谁让你去看二进制代码了, 你那脑子够用吗?

机制的重点就3句话:

1. callback = bind(f, arg);  绑定原函数f与一些参数arg, 生成一个closure
2. callback( other );           对closure执行调用, 并传递如下参数other
3. f( arg, other );              等价于原函数f以arg+other调用。

抓住了吗? 看明白了吗?

论坛徽章:
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
36 [报告]
发表于 2010-05-09 02:05 |只看该作者
要将自己的不懂, 自己的无能, 伪装成不屑懂。
你就这么一直伪装下去好了。
OwnWaterloo 发表于 2010-05-09 01:47



你自己说是不是自己弄了一个类似循环似的东西好了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
37 [报告]
发表于 2010-05-09 02:14 |只看该作者
你自己说是不是自己弄了一个类似循环似的东西好了
zylthinking 发表于 2010-05-09 02:05


哪?
continuation可以认为是一个类似循环的东西, 因为本来就需要一连串的调用。

code中保存的是一段转发(forwarding)用的机器码, 是为了弥补调用者做的准备与被调用者所希望之间的不同。
没有循环和查询。


void handler(void* context, int sig);
closure = bind(handler, context);

每个closure就相当于下面的函数被编译后的东西:
void forwarding(int sig) {
      handler(context /*写死在编译后的代码中*/, sig);
}

论坛徽章:
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
38 [报告]
发表于 2010-05-09 02:32 |只看该作者
谁让你去看二进制代码了, 你那脑子够用吗?

机制的重点就3句话:

1. callback = bind(f, arg);  ...
OwnWaterloo 发表于 2010-05-09 01:50



别以为就你懂汇编或者在这里就说机器指令吧, 也别觉得你写的是天书; 懒得较真而已, 因为我觉得我猜出你是的那堆数字是想干什么了而已; 谁说你觉得只有你的是唯一方案了? 自己回去翻帖子, 然后凭良心说话是不是我编辑掉了。

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

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

int callback(){
return 0;
}

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

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

论坛徽章:
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
39 [报告]
发表于 2010-05-09 02:38 |只看该作者
哪?
continuation可以认为是一个类似循环的东西, 因为本来就需要一连串的调用。

code中保存的是一 ...
OwnWaterloo 发表于 2010-05-09 02:14



你既然承认是一个类似循环的东西就好了, 你可以说我装不屑懂, 反正我猜对了, 那么是不是 signal handler在OS机制中只能替换不能add也可以说我有对没把握的东西没有胡说八道了?

论坛徽章:
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
40 [报告]
发表于 2010-05-09 02:41 |只看该作者
人为在数据段造调用栈, 然后转化成代码执行吗, 好吧, 这句话有问题,
人为在数据段造调用栈及插入部分机器指令, 然后转化成代码执行吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP