epoll_wait не просыпается до нажатия на ввод - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в epoll. Мой код работает нормально. Эполл хранит мой дескриптор файла и ждет, пока дескриптор файла не будет «готов». Но по какой-то причине он не проснется, пока я не нажму на Enter (хотя данные уже получены на fd, и после ввода я сразу же увижу все данные, которые были отправлены ранее). После одного ввода он будет работать как положено (ввод не требуется, и когда fd снова будет готов, он снова проснется).

Вот суть моего кода:

    int nEventCountReady = 0;
    epoll_event event, events[EPOLL_MAX_EVENTS];
    int epoll_fd = epoll_create1(0);

    if(epoll_fd == -1)
    {
        std::cout << "Error: Failed to create EPoll" << std::endl;
        return ;
    }

    event.events = EPOLLIN;
    event.data.fd = myfd;

    if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event))
    {
        fprintf(stderr, "Failed to add file descriptor to epoll\n");
        close(epoll_fd);
        return ;
    }

    while(true)
    {
        std::cout << "Waiting for messages" << std::endl;
        nEventCountReady = epoll_wait(epoll_fd, events, EPOLL_MAX_EVENTS, 30000); << Stuck until Enter will be pressed (at first while loop)
        for(int i=0; i<nEventCountReady; i++)
        {
            msgrcv(events[i].data.fd, oIpCMessageContent, sizeof(SIPCMessageContent), 1, 0);
            std::cout << oIpCMessageContent.buff << std::endl;
        }
    }

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Это

if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event))

, вероятно, должно быть

if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, myfd, &event))

В первой строке вы указываете epoll контролировать fd 0, который обычно является стандартным входом. Вот почему он ждет его, например, для вашего Enter.

Обратите внимание, что ваш оригинальный код работает только по совпадению. Просто бывает, что когда вы вводите, в вашем myfd есть данные (и даже если нет блоков msgrcv). И как только вы нажмете Enter, он будет постоянно просыпаться, так как epoll знает, что STDIN готов, но вы не читали с него.

0 голосов
/ 14 апреля 2020

Благодаря kamilCuk я заметил, что msgget не возвращает дескриптор файла, как я думал. Он возвращает «Идентификатор очереди сообщений System V».

И, как говорилось ранее в freaki sh, очереди сообщений System V не работают с такими селекторами, как epoll.

...