gpt4 book ai didi

c - 为什么在 glib 主上下文中用 zmq_poll() 替换 poll() 时出现段错误?

转载 作者:行者123 更新时间:2023-12-02 03:57:30 24 4
gpt4 key购买 nike

我正在尝试将 Zeromq 集成到 glib 主循环中,但我无法弄清楚为什么我的程序出现段错误。

这是在运行 g_main_loop_run(loop) 后保证出现段错误的函数:

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

考虑到zmq_poll,我认为这会起作用。与 poll 具有相同的结构,并使用 s/zmq_poll/poll/调用相同的函数效果很好。

我的代码的剥离版本仍然存在段错误:http://paste.pocoo.org/show/568289/ .

(未经测试)完整版本:http://paste.pocoo.org/show/568292/ .

堆栈跟踪:

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

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

我做错了什么?

感谢您的任何帮助,谢谢。

编辑:通过使用此函数作为我的民意调查替代品,让它与亚历山大建议的内容一起工作:

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_);
}

说实话,我什至不确定它是如何工作的,但我是一个 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_poll 的预期数据格式为

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_);
}

关于c - 为什么在 glib 主上下文中用 zmq_poll() 替换 poll() 时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com