繁体   English   中英

epoll_event不同的初始化导致不同的epoll_wait结果

[英]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 错误并获得我期望的结果?

  1. new_event.data是一个union 也就是说,它的各个元素共享同一个存储。 当您将 data.ptr 初始化为NULL时,它会覆盖一些(可能是全部)其他字段(取决于您的系统,特别是指针的大小)。
  2. 想到两个选择:
  • (a) 配置 valgrind 以抑制错误,因为它可以说是误报(valgrind 不知道该结构的某些部分未初始化是可以的)
  • (b) 以稍微冗长的方式初始化结构:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM