1

我想知道如何将 Ruby 的事件循环与 C 中的 Ruby 扩展集成。我不确定这是否是做我想做的事情的正确方法,所以我会解释这个问题。

我正在使用msgrcvand 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 扩展中的接收器方法。

如何才能做到这一点?

4

1 回答 1

2

未经测试,这假设您想在没有消息时在类上调用某些方法(显然您需要实现):

do{
    if( msgrcv( msqid, &rcvbuffer, MAXSIZE, 1, IPC_NOWAIT ) < 0) {
        // Handle error conditions
        if ( rcvbuffer.errno == ENOMSG ) {
          rb_funcall(self, rb_intern("no_msg_callback_method"), 0);
          // Or you could simply  . . .
          // break;
        } else {
          printf("Error");
        }
    }else{
        rb_funcall(self, rb_intern("callback_method"), 1, rb_str_new2(rcvbuffer.mtext));
    }
} while(strcmp(rcvbuffer.mtext, "exit") != 0);

您的另一个选择是设置一个标志并在没有消息时允许循环退出。然后方法调用者需要确定它是否收到了“退出”消息(也发送到callback_method),或者当前没有要处理的消息,所以可以做其他事情。

于 2013-06-03T07:52:17.677 回答