[英]epoll_event different initialization causes different epoll_wait results
使用 valgrind 运行以下代码段:
struct epoll_event server_socket_conn_ev = {.events = EPOLLIN, .data.fd = server_socket};
//server_socket_conn_ev.data.ptr = NULL;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_socket, &server_socket_conn_ev) == -1) {
perror(NULL);
return 1;
}
struct epoll_event new_event;
while(1) {
epoll_wait(epoll_fd, &new_event, 1, -1);
...
我收到以下错误:
==16219== Syscall param epoll_ctl(event) points to uninitialised byte(s)
==16219== at 0x524AA7A: epoll_ctl (syscall-template.S:84)
==16219== by 0x401464: run_server (server.c:85)
==16219== by 0x401367: main (server.c:57)
==16219== Address 0xfff0002e8 is on thread 1's stack
==16219== in frame #1, created by run_server (server.c:69)
此处的修复是取消注释片段中的第二行。 但是,这样做会给我带来不同的结果,特别是变量new_event 。
如果不将 data.ptr 初始化为 NULL,那么我得到了new_event的以下值:
(gdb) p new_event
$1 = {events = 1, data = {ptr = 0x3, fd = 3, u32 = 3, u64 = 3}}
正如预期的那样。
然而,通过初始化 data.ptr = NULL,那么new_event在等待调用之后保持初始化:
(gdb) p new_event
$1 = {events = 1, data = {ptr = 0x0, fd = 0, u32 = 0, u64 = 0}}
1.) 为什么这个初始化会影响 epoll_wait 的结果?
2.) 我怎样才能摆脱 valgrind 错误并获得我期望的结果?
new_event.data
是一个union 。 也就是说,它的各个元素共享同一个存储。 当您将 data.ptr 初始化为NULL
时,它会覆盖一些(可能是全部)其他字段(取决于您的系统,特别是指针的大小)。 struct epoll_event server_socket_conn_ev = {.events = EPOLLIN, .ptr = NULL }; server_socket_conn_ev.fd = server_socket;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.