【问题标题】:How to use epoll?如何使用epoll?
【发布时间】:2013-05-27 22:57:06
【问题描述】:

考虑如下代码sn-p:

#import <pthread.h>
#import <stdio.h>
#import <sys/epoll.h>
#import <sys/eventfd.h>
#import <unistd.h>

int epollfd;
int evntfd;

void *function(void *arg) {
    struct epoll_event events;

    while(1) {
        int c = epoll_wait(epollfd, &events, 1, -1);

        if(c != -1) {
            printf("%d\n", c);
            break;
        }
    }

    return NULL;
}

int main() {
    evntfd = eventfd(0, 0);

    epollfd = epoll_create(0);

    struct epoll_event evnt = { 0 };
    evnt.data.fd = evntfd;
    evnt.events = EPOLLIN | EPOLLET;

    epoll_ctl(epollfd, EPOLL_CTL_ADD, evntfd, &evnt);

    pthread_t thread;
    pthread_create(&thread, NULL, &function, NULL);

    sleep(1);

    unsigned long int u = 7;
    write(evntfd, &u, sizeof(unsigned long int));

    sleep(1);

    return 0;
}

write() 不应该让epoll_wait 返回一个不同于-1 的值吗?当我编译上面的代码并运行它时,什么都没有打印出来......

【问题讨论】:

    标签: linux epoll


    【解决方案1】:

    我在你的代码上运行了strace,发现了一个令人惊讶的结果:

    epoll_create(0)                         = -1 EINVAL (Invalid argument)
    

    您的 epoll 文件描述符的大小需要大于零。这使其他一切都失败了。

    【讨论】:

    • 感谢您的回答!你是对的,epoll_create 正在返回-1,为什么会发生这种情况?好吧,因为epoll_create 的单个参数必须大于零。因此,例如,将其从 0 更改为 1 后,一切都按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多