读书人

关于poll()的唤醒有关问题

发布时间: 2012-12-17 09:31:40 作者: rapoo

关于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

读书人网 >UNIXLINUX

热点推荐