免费注册 查看新帖 |

Chinaunix

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

[其他] [lua相关]请教c函数挂起lua的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-07 16:20 |只看该作者 |倒序浏览
用的lua5.2 我的需求是想在lua中实现阻塞函数
网上搜了下然后我这样实现
int pause(lua_State *L)
{
        return lua_yield(L, 0);
}

lua_pushcfunction( L, pause );
lua_setglobal( L, "pause" );
lua_pushcfunction( L, trace );
lua_setglobal( L, "trace" );

if (luaL_loadfile(L, "test.lua"))
     error(L, "cannot run script %s\n", lua_tostring(L,-1));
lua_resume(L, NULL, 0);

在lua单独中调用没问题
但是如果我写进一个函数里面,然后由c来调用就出问题了

function func()
        trace(1)
        pause(5000);
        trace(2);
end

lua_getglobal(L, "func");
lua_pcall(L, 0, 0, 0);

这时候会出来lua_longjmp错误
google到这个http://www.lua.org/manual/5.2/manual.html#4.7
但是基础太差 看不懂 不知道怎么实现

求指教 谢谢。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-05-07 19:59 |只看该作者
不要在C里做yield, 因为C得函数调用栈经过yield实际是做了C中的longjmp回到了resume, 堆栈全破坏了.

在lua5.2里这个问题得到解决, 可以使用lua_yieldk, 当然我更建议你使用传统标准做法, 在lua module中封装wrapper api, 用C实现功能在wrapper内调用, 并在wrapper内做yield, 因为在lua里做yield可以保留堆栈, 是可以resume回来的.

论坛徽章:
0
3 [报告]
发表于 2013-05-08 15:58 |只看该作者
回复 2# linux_c_py_php
用k函数问题依旧
我的情况是这样的
C 注册了pause函数 pause 挂起lua
C调用lua定义的函数fun
fun里面调用c函数 pause
这样就发生错误了
是我用的方式不对 还是lua根本不允许这样的情况?


   

论坛徽章:
0
4 [报告]
发表于 2013-05-08 16:05 |只看该作者
stackoverflow 里面有人这样回答我
And lastly, you cannot yield across C call boundary. That is, when you call lua_pcallk and the chunk that pcallk is calling yields, the continuation function is executed. However, you cannot have lua_pcallk call a Lua function that in turn calls a C function that yields (pause in your example). That's forbidden.

真的是这样的吗?
那我死心了

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-05-08 17:30 |只看该作者
说了嘛, 要么yieldk传入一个continue函数来继续执行, 要么在lua代码中yield来保留堆栈.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP