- 论坛徽章:
- 11
|
本帖最后由 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楼说: 既然闭包了老半天, 似乎高深莫测, 我偏偏还是愚钝, 还是老问题问你, 你的实现比我上面贴出的代码优点在哪里?
说到底, 我们两个都没有搞清楚对方到底要说什么, 呵呵 |
|