使用alarm函数设置超时
void handler(int sig)
{
}
signal(SIGALRM, handler);
alarm(5);
int ret = read(fd, buf, sizeof(buf));
if (ret == -1 && errno == EINTR)
errno = ETIMEOUT;
else if (ret >= 0)
alarm(0);
EINTR为中断信号,如果read在5s内被SIGALRM信号中断而返回,则表示超时,否则未超时已读取到数据,取消闹钟。但这种方法不常用,因为有时可能在其他地方使用了alarm会造成混乱。