gpt4 book ai didi

c - epoll 返回 0 个事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 25 4
gpt4 key购买 nike

我有两个文件描述符,一个是管道上的读取文件描述符,另一个是套接字连接描述符。它们都不是非阻塞的。它们都被添加到具有单个 EPOLLIN 事件的 epoll 上下文中。最后,我用超时 = -1 调用 epoll_wait。下面是示例代码。我有两个问题:-

  1. 管道和连接描述符是否需要非阻塞。这不是边缘触发。如果是,这是好的做法还是强制性的?如果是强制性的,为什么?

  2. 我将超时设置为 -1,但 epoll_wait 立即返回并返回值 0。为什么会这样?超时为 -1,epoll_wait 应该只在有事件发生时返回。

    int total_fd_ready = -1;
    struct epoll_event pipe_event, connection_event, total_events[64];

    pipe_event.data.fd = pipe_fd[0];
    piple_event.events = EPOLLIN;
    connection_event.data.fd = conn_fd;
    connection_event.events = EPOLLIN;

    total_fd_ready = Epoll_wait(epoll_fd, total_events, 64, -1);
    printf("%d\n", total_fd_ready);

    epoll_wait 定义为

    int Epoll_wait(int e_fd, struct epoll_event *events, int max_events, int timeout)
    {
    #ifdef DBG
    printf("Epoll_wait called on epoll_fd: %d with max_events: %d and timeout: %d\n", e_fd, max_events, timeout);
    #endif

    int result = -1;
    if(result = (epoll_wait(e_fd, events, max_events, timeout)) < 0)
    if(errno != EINTR)
    err_sys("epoll_wait error with epoll fd: %d and timeout : %d\n", e_fd, timeout);
    #ifdef DBG
    else
    printf("epoll_wait was interrupted\n");
    #endif
    return result;
    }

更新:找到了问题,虽然我无法解释为什么结果设置为 0。我需要在下面的 if 语句中使用括号

 if((result = (epoll_wait(e_fd, events, max_events, timeout))) < 0)

最佳答案

答案是比较运算符<优先级高于赋值,这意味着 result被赋值为表达式 (epoll_wait(e_fd, events, max_events, timeout)) < 0 的结果.

关于c - epoll 返回 0 个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016882/

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