2012-03-20 4 views
3

私はzeromqをglibのメインループに統合しようとしていますが、私のプログラムがなぜsegfaultであるのか分かりません。glibのメインコンテキストでpoll()をzmq_poll()に置き換えると、なぜ私はsegfaultですか?

ここもg_main_loop_run(ループ)を実行した後にセグメンテーションフォルトを保証機能です:

/** set poll fn to operate on zmq or unix sockets */ 
g_main_context_set_poll_func(g_context, (GPollFunc) zmq_poll); 

のI/pollとしてzmq_poll株式と同じ構造を考慮すると、これが機能するだろうと思った、とsと同じ関数を呼び出しますzmq_poll/poll /はうまく動作します。

私のコードを削除したバージョンはまだsegfault'ing:http://paste.pocoo.org/show/568289/です。

(未テスト)完全版:http://paste.pocoo.org/show/568292/

スタックトレース:私は間違って何をやっている

gcc --debug `pkg-config gstreamer-0.10 --libs` -lzmq `pkg-config gstreamer-0.10 --cflags` -o test test.c 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff6a2bd50 in ??() 
    from /usr/lib/libzmq.so.1 
(gdb) bt 
#0 0x00007ffff6a2bd50 in ??() 
    from /usr/lib/libzmq.so.1 
#1 0x00007ffff6a34b4d in zmq_getsockopt() 
    from /usr/lib/libzmq.so.1 
#2 0x00007ffff6a34e1b in zmq_poll() 
    from /usr/lib/libzmq.so.1 
#3 0x00007ffff6c89dc8 in ??() 
    from /usr/lib/libglib-2.0.so.0 
#4 0x00007ffff6c8a5f2 in g_main_loop_run() 
    from /usr/lib/libglib-2.0.so.0 
#5 0x0000000000402978 in main (argc=1, 
argv=0x7fffffffe5e8) at server.c:229 

はとコード(あなたはgstreamerのを持っているし、インストールzeromq仮定)をコンパイルしますか?

ご協力いただきありがとうございます。

EDIT:それはアレクサンダーは私のポーリング代替として、この機能を使用することにより、提案するもので動作するようになった:正直に言うと

gint zmq_poll_adapter(GPollFD *ufds, guint nfsd, gint timeout_) 
{ 
    zmq_pollitem_t ufds0[nfsd]; 
    int i; 
    for (i = 0; i < nfsd; i++) 
    { 
     ufds0[i].socket = NULL; 
     ufds0[i].fd = ufds[i].fd; 
     ufds0[i].events = ufds[i].events; 
     ufds0[i].revents = ufds[i].revents; 
    } 
    zmq_poll(ufds0, nfsd, timeout_); 
} 

私は、これは同様にそれをやったとして働いていたかさえもわからないんだけど、I Cの初心者で、より適応性の高いadapt()を作る方法がほとんどありません。

gint zmq_poll_adapter(GPollFD *ufds, guint nfsd, gint timeout_) 
{ 
    zmq_pollitem_t *ufds0 = adapt(ufds, nfsd); 
    zmq_poll(ufds0, nfsd, timeout_); 
} 

はGPollFuncコールバックの

予想されるデータフォーマットがある

答えて

2

struct GPollFD { 
#if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8 
    gint64 fd; 
#else 
    gint  fd; 
#endif 
    gushort events; 
    gushort revents; 
}; 
zmq_pollため

予想されるデータフォーマットがある

typedef struct 
{ 
    void //*socket//; 
    int //fd//; 
    short //events//; 
    short //revents//; 
} zmq_pollitem_t; 

ソリューションは、アダプタを書き、g_main_context_set_poll_funcためにそれを渡すことです

関連する問題