本文共 2908 字,大约阅读时间需要 9 分钟。
pselect() 函数的原型是:int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask); 它和 select() 函数基本相同,区别在于两个不同的参数,一个是 struct timespec *timeout,另一个是 sigset_t *sigmask 。
struct timespec 结构定义为: struct timespec { long tv_sec; long tv_nsec; };
其中的时间表示秒和纳秒。和
select() 不同,每次超时后,pselect() 并不会去修改这个时间参数,也就是说,没有必要再次对这个时间参数进行初始化。 对于最后一个参数 sigmask 表示信号屏蔽掩码,设置掩码可以对相应的信号进行屏蔽,这样pselect就一直不会被屏蔽的信号所中断。
select等待期间不想被中断的方法有两个:
其一:pselect 代替select
#include "unp.h"
void sig_alarm(int signo) { printf("%d\n",signo); if(signo == SIGALRM) { printf("SIGALRM\n"); } else if(signo == SIGVTALRM) { printf("SIGVTALRM\n"); } } int main() { sigset_t sigmask; fd_set rset; ssize_t nread; char buf[MAXLINE]; int maxfd; struct itimerval value; signal1(SIGALRM,sig_alarm); value.it_interval.tv_sec = 3; value.it_interval.tv_usec = 0; value.it_value.tv_sec = 1; value.it_value.tv_usec = 0; if(setitimer(ITIMER_REAL,&value,NULL) == -1) { printf("setitimer error.\n");