我想知道如何在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' ( 「錯誤」)')。這可以是「無消息」回調 - 類似於處理消息的消息 - 也可以返回形式的擴展,期望主代碼在準備處理消息時再次調用。你想要的取決於包含代碼的結構。 –