免费注册 查看新帖 |

Chinaunix

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

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

rsjq 该用户已被删除
51 [报告]
发表于 2010-05-09 18:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
52 [报告]
发表于 2010-05-09 21:34 |只看该作者
typedef struct foo{
int arg1;
int arg2;
int arg3;
}mularg;
*****************
之后
signal(SIG_INT,foo.arg1);
那么arg2就根据地址来找了
不知可否

论坛徽章:
0
53 [报告]
发表于 2010-05-10 09:12 |只看该作者
结构体

论坛徽章:
0
54 [报告]
发表于 2010-05-10 09:45 |只看该作者
看不懂。。。

论坛徽章:
0
55 [报告]
发表于 2010-05-10 10:03 |只看该作者
typedef struct foo{
int arg1;
int arg2;
int arg3;
}mularg;
*****************
之后
signal(SIG_ ...
sykp241095 发表于 2010-05-09 21:34


实参和形参不是一回事

论坛徽章:
0
56 [报告]
发表于 2010-05-10 16:15 |只看该作者
sigqueue可以传一个int,当然也可以当成指针用,更多的数据无法传。

论坛徽章:
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
57 [报告]
发表于 2010-05-10 16:25 |只看该作者
回复 56# nxin

这个才是正解, 费了半天劲。 似乎 16 楼和flw都提到过, 可惜都没说的很具体, 也懒惰没找资料。。。。。。。。。。。。。

论坛徽章:
0
58 [报告]
发表于 2010-05-10 17:22 |只看该作者
回复 55# KBTiller


    恩,是错了,之后更加联想到,那是回调函数!!!哪能让我传参数呢。。。!!!

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
59 [报告]
发表于 2010-05-11 10:42 |只看该作者
如果LZ的程序是单线程,那么我认为没必要搞那么复杂,直接调用就行了。
如果LZ的程序是多线程,希望用信号去通知主线程做某事的话,那么全局变量是不合适的,如果有两个线程同时去通知的话会有问题;如果是OwnWaterloo的方法,直接用栈上的内存作执行代码也不行,只能是分配出内存作可执行代码,而且硬编码部分也需要修改,大致是这种格式(intel格式汇编):

  1. pop dword ptr[addr]          ;addr要在分配出的同段内存内,取出返回地址
  2. push param                   ;压入自定义参数
  3. call handler                 ;调用原回调
  4. mov eax, dword ptr[addr]
  5. mov [esp], eax               ;写回返回地址
  6. mov [esp+4], alloc_pointer   ;将分配首地址写入        
  7. jmp free                     ;假设内存是malloc出来的,跳到free释放
复制代码
不过还是有一个问题,如果两线程同时调用的话,注册以后signal之前可能会被其他线程重新注册,这样就需要加锁,而需要锁多久却不好判断(发出信号是否意味着可以解锁呢?我觉得似乎还不行)。
感觉这东西没那么容易处理,还不如换一个方法去通知主线程干活。

另外OwnWaterloo兄的0xC7、0x04、0x24应该是弄错了吧?

论坛徽章:
0
60 [报告]
发表于 2010-05-11 10:47 |只看该作者
传个结构体指针过去
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP