我想知道如何在C中集成Ruby的事件循环和Ruby扩展。我不确定这是否是正在尝试做的事情的正确方法,所以我会解释这个问题。将Ruby中的事件循环集成到C扩展中
我使用msgrcv
和msgsnd
(IPC),因此在Ruby C扩展和其他应用程序之间发送消息。问题是接收消息的扩展方法会产生如下的无限循环:
do{
if(msgrcv(msqid, &rcvbuffer, MAXSIZE, 1, 0) < 0){
printf("Error");
}else{
rb_funcall(self, rb_intern("callback_method"), 1, rb_str_new2(rcvbuffer.mtext));
}
} while(strcmp(rcvbuffer.mtext, "exit") != 0);
并且锁定了ruby的解释器。我希望能够在不阻塞的情况下在Ruby扩展中调用接收方法。
这怎么办?
msgrcv和msgsnd从哪里来?他们有没有选择只检查几毫秒,然后继续?这会给你三个条件 - 错误,过程消息和“继续” - 用一个“继续”你退出循环,并确保它将被控制代码再次调用,或者有相反的情况,并且没有消息回调“这是重复调用,而没有发生任何事情。如果由于某种原因两者都不可行,那么在单独的线程中运行消息处理可能会有效,但会让人头疼,尤其是在您已经运行异步进程的情况下。 –
@NeilSlater msgrcv和msgsnd是标准内核调用http://linux.die.net/man/2/msgrcv我想避免线程。 – alexandernst
我想你想设置IPC_NOWAIT标志,当没有要处理的消息时,通过将控制交给主脚本来处理错误num(例如,将错误num赋给一个变量并检查它现在只有'printf' ( “错误”)')。这可以是“无消息”回调 - 类似于处理消息的消息 - 也可以返回形式的扩展,期望主代码在准备处理消息时再次调用。你想要的取决于包含代码的结构。 –