免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-06 18:18 |只看该作者 |倒序浏览
回调函数->void handler(int a,int b);

signal(SIGALRM,??????)
问号部分该怎么写啊

论坛徽章:
0
2 [报告]
发表于 2010-05-06 18:30 |只看该作者
这肯定不行,,编译直接不通过。。。。。
可以用全局变量来传递,,

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
3 [报告]
发表于 2010-05-06 18:36 |只看该作者
这肯定不行,,编译直接不通过。。。。。
可以用全局变量来传递,,
unistd 发表于 2010-05-06 18:30



    能说的清楚点吗?怎么用全局变量?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2010-05-06 18:41 |只看该作者
你理解了signal的那个回调函数的参数意义吗?

论坛徽章:
0
5 [报告]
发表于 2010-05-06 18:43 |只看该作者
  1. typedef void (*sighandler_t)(int);
  2.        sighandler_t signal(int signum, sighandler_t handler);
复制代码
应该是不能传递多个参数的!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
6 [报告]
发表于 2010-05-06 18:46 |只看该作者
你理解了signal的那个回调函数的参数意义吗?
cjaizss 发表于 2010-05-06 18:41


这个到知道,回调函数的定义貌似只能接收一个int型的参数吧,现在我想让他接收多个其他类型的参数

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2010-05-06 18:52 |只看该作者
这个到知道,回调函数的定义貌似只能接收一个int型的参数吧,现在我想让他接收多个其他类型的参数
cascle 发表于 2010-05-06 18:46



    接受其他类型的参数拿来干嘛???

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
8 [报告]
发表于 2010-05-06 18:55 |只看该作者
回复 7# cjaizss


    我想实现一个定时器,在回调函数里边实现相应的功能

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
9 [报告]
发表于 2010-05-06 18:57 |只看该作者
一般这类参数都是void类型的指针,再传个结构体就行了,但这个是int型的,我就没辙了

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

  1. #include <stdio.h>
  2. #include <string.h>

  3. void handler(void* context, int n) {
  4.       printf("%d %d\n", *(int*)context, n);
  5. }
  6. unsigned char* promote_to_executable(unsigned char* src, size_t s);

  7. int main(void)
  8. {
  9.       unsigned char layout[] = {
  10.             0x8f,0x05,      0xcc,0xcc,0xcc,0xcc,
  11.             0x68,           0xcc,0xcc,0xcc,0xcc,
  12.             0xe8,           0xcc,0xcc,0xcc,0xcc,
  13.             0xc7,0x04,0x24, 0xcc,0xcc,0xcc,0xcc,
  14.             0xc3,
  15.       };
  16.       unsigned char*   code = promote_to_executable(layout, sizeof layout);
  17.       void (*callback)(int) = ( void (*)(int) )code;

  18.       int   i = 1212;
  19.       void* context = &i;

  20.       size_t offset = (size_t)handler - 5 - (size_t)&code[11];
  21.       unsigned char* ret = &code[19];
  22.       memcpy(&code[12], &offset,  4);
  23.       memcpy(&code[7] , &context, 4);
  24.       memcpy(&code[2] , &ret,     4);

  25.       callback(326);    /* == handler(context, 326); */
  26.       /* 输出: 1212 326 */

  27.       return 0;
  28. }

  29. #include <windows.h>
  30. unsigned char* promote_to_executable(unsigned char* src, size_t s)
  31. {
  32.       DWORD old;
  33.       VirtualProtect(src, s, PAGE_EXECUTE_READWRITE, &old);
  34.       return src;
  35. }
复制代码
需要获得一块内容同layout的可执行内存。 方法有很多。
然后在这块内存上弄来弄去, 最后将它作为一个函数指针调用, 就ok了。

获得可执行内存的方法:
1. 关闭数据执行保护
2. 提升, VirtualProtect, mprotect
3. 分配, VirtualAlloc, mmap
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP