日期:2014-05-16  浏览次数:20935 次

关于poll()的唤醒问题
本帖最后由 allen_4167 于 2012-11-21 16:19:22 编辑 我在应用中poll()监听了一组fd的读变化,现在需要在fd集没有可读数据的情况下,在另一个线程中随时把这个阻塞状态中的poll()唤醒,请问有办法么??
一般这种情况下的程序应该如何设计?

谢谢~
------最佳解决方案--------------------

#include <unistd.h>
#include <poll.h>
#include <pthread.h>
#include <signal.h>

#include <stdio.h>

void  sigusr1(int sig)
{
}

void *poller(void *arg)
{
    int ret;

    struct sigaction act;
    struct pollfd fds[1];

    act.sa_handler = sigusr1;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
#ifdef SA_INTERRUPT
    act.sa_flags 
------其他解决方案--------------------
应该使用poll的timeout参数,
如果真由这种需要,可以用信号中断。
------其他解决方案--------------------
我的情况不能用timeout,请问如何用信号中断?
给poll()所在的线程发信号?然后怎样使poll()返回呢??难道在信号处理函数中直接把整个线程退出?

请mymtom指点~
------其他解决方案--------------------
= SA_INTERRUPT;
#endif
    sigaction(SIGUSR1, &act, NULL);

    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;
    fds[0].revents = 0;

    ret = poll(fds, 1, -1);

    if (ret < 0)
        perror("poll");

    return NULL;
}

int main(int argc, char *argv[])
{
    pthread_t tid;

    pthread_create(&tid, NULL, poller, NULL);
    sleep(5);
    pthread_kill(tid, SIGUSR1);
    pthread_join(tid, NULL);

    return 0;
}

------其他解决方案--------------------
信号处理函数中尽量什么都不做.
poll收到信号后会返回EINTR