在 socket 编程中,有一些函数是阻塞的,为了使程序高效运行,有一些办法可以把这些阻塞函数变成非阻塞的,本文介绍一种使用定时器信号中断阻塞函数的方法,同时介绍了一些信号处理和定时器设置的编程方法,本文附有完整实例的源代码,本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文不适合 Linux 编程的初学者阅读。
1 前言
- 在 socket 编程中,阻塞还是不阻塞是经常要考虑的问题,
accept()
、recv()
等一些函数都是阻塞函数,阻塞函数有时会给程序带来麻烦; - 使用
select()
或者poll()
监视socket
描述符可以有效地避免诸如accept()
、recv()
等函数的阻塞带来的麻烦; - 下面这段代码是使用 select() 避免阻塞的示例:
int sockfd = socket(AF_INET, SOCK_STREAM , 0); ...... fd_set fds; FD_ZERO(fd_set); FD_SET(sockfd, &fds); struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; if (select(sockfd + 1, &fds, NULL, NULL, &tv)) { if