-
Real-time Signal 学习 - [Linux]
2007-08-16
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://morningsun.blogbus.com/logs/7731943.html
Real-time signal 是linux 2.3内核后引入的新的feature。类似于win32的Completion Port, Realtime signal 机制可用于反应器,适用于server的高速IO模型。
Real-time signal 的原理是,将文件描述符通过fnctl 设置为nonblock,类似这样:
nflags |= O_RDWR | O_NONBLOCK | O_ASYNC;
nFcntl = ::fcntl(aFd, F_SETFL, nflags);再将该句柄与具体的real-time signal 绑定,
nFcntl = ::fcntl(aFd, F_SETSIG, RTSIG_X)
最后设置这个描述符将该信号报往的进程Pid
nFcntl = ::fcntl(aFd, F_SETOWN, Pid);
这些工作做完之后,当该文件描述符发生io操作时将上报给进程real-time signal RTSIG-X
而reactor可以run一个工作线程,并设置感兴趣的信号集sigset为阻塞状态
nRet = ::sigprocmask(SIG_BLOCK, &sigset, NULL);
linux proc/ 文件系统中的设置rt signal 最大值的文件是/proc/sys/kernel/rtsig-max,可以通
_sysctl命令进行调解。节点名为{ CTL_KERN, KERN_RTSIGMAX }
OK, 一切做完之后,我们只要将工作线程run起来后,做等待信号操作
sigRet = ::sigwaitinfo(&sigset, &siginfo);
返回后并检查siginfo.si_band的值,如果是POLLERR|POLLHUP|POLLNVAL 为error值,
否则处理该句柄,进行相应的读写操作。
while(!shutDown())
{
int sigret = sigwaitinfo(&sigset, &siginfo);
...
handleEvent(sigret,...)
}随机文章:
Linux 下创建基于Image的小分区 2007-08-03linux kernel 体系结构 2007-07-04Using Vtune 8.02 in Linux 2007-03-15i386, i686的区别 2006-11-24安装win32和Linux双系统的boot loader设置 2006-11-23
收藏到:Del.icio.us







