Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我是塞格弗劳特';在glib主上下文中将poll()替换为zmq_poll()时是否正在初始化?_C_Gstreamer_Glib_Zeromq - Fatal编程技术网

C 为什么我是塞格弗劳特';在glib主上下文中将poll()替换为zmq_poll()时是否正在初始化?

C 为什么我是塞格弗劳特';在glib主上下文中将poll()替换为zmq_poll()时是否正在初始化?,c,gstreamer,glib,zeromq,C,Gstreamer,Glib,Zeromq,我试图将zeromq集成到一个油嘴滑舌的主循环中,但我不明白为什么我的程序会出现故障 以下是保证在运行g_main_loop_run(loop)后发生segfault的函数: 考虑到与共享相同的结构,并且使用s/zmq_poll/poll/调用相同的函数,我认为这会起作用 我的代码的剥离版本仍然存在分段错误: (未测试)完整版本: 堆栈跟踪: Program received signal SIGSEGV, Segmentation fault. 0x00007ffff6a2bd50 in ??

我试图将zeromq集成到一个油嘴滑舌的主循环中,但我不明白为什么我的程序会出现故障

以下是保证在运行g_main_loop_run(loop)后发生segfault的函数:

考虑到与共享相同的结构,并且使用s/zmq_poll/poll/调用相同的函数,我认为这会起作用

我的代码的剥离版本仍然存在分段错误:

(未测试)完整版本:

堆栈跟踪:

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):

我做错了什么

非常感谢您的帮助,谢谢

编辑:通过使用此功能作为我的投票替代,使其与alexander建议的内容一起工作:

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_);
}
gint zmq\u poll\u适配器(GPollFD*ufds、gint nfsd、gint timeout)
{
zmq_pollitem_t ufds0[nfsd];
int i;
对于(i=0;i

老实说,我甚至不知道它是如何工作的,但我是一个C新手,不知道如何进行更自适应的adapt()。

GPollFunc回调的预期数据格式是

struct GPollFD {
#if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8
  gint64 fd;
#else
  gint      fd;
#endif
  gushort   events;
  gushort   revents;
};
zmq_轮询的预期数据格式为

typedef struct
{
    void //*socket//;
    int //fd//;
    short //events//;
    short //revents//;
} zmq_pollitem_t;
解决方案是写入适配器并将其传递给g_main_context_set_poll_func:

gint zmq_poll_adapter(GPollFD *ufds, guint nfsd, gint timeout_)
{
    zmq_pollitem_t *ufds0 = adapt(ufds, nfsd);
    zmq_poll(ufds0, nfsd, timeout_);
}
typedef struct
{
    void //*socket//;
    int //fd//;
    short //events//;
    short //revents//;
} zmq_pollitem_t;
gint zmq_poll_adapter(GPollFD *ufds, guint nfsd, gint timeout_)
{
    zmq_pollitem_t *ufds0 = adapt(ufds, nfsd);
    zmq_poll(ufds0, nfsd, timeout_);
}