linux下使用select I/O复用和多线程编程实现简单的TCP服务器
I/O 复用之Select模型 I/O 复用使得程序能够同时监听多个文件描述符,但是,他本身也是阻塞的,并且当一个或多个文件描述符准备就绪时,如果不采用其他措施,程序只能按顺序处理其中的每个文件描述符。如果要使程序能够并行运行,只能使用多进程或多线程的方式。 Linux 下实现I/O复用的系统调用主要有select、poll和epoll,下面将详细介绍select的系统调用。 Select 系统调用的用途:在一段时间内,监听用户感兴趣的文件描述符上面的可读、可写和异常等事件。 相关 API 的介绍: #include <sys/select.h> int select(int nfds, fd_set * readfds, fd_set * writefdds, fd_set * exceptfds, struct timeval * timeout); ① 、 nfds参数:所有监听的文件描述符的最大值 + 1 ② 、 readfds、writefds和exceptfds参数分别为可读、可写和异常等事件对应的文件描述符集合;程序只需要传入自己感兴趣的文件描述符,内核将修改他们来通知程序那些文件描述符已经准备就绪;fd_set结构体仅包含一个整形数组,该数组的每一个元素的每一位标志一个文件描述符,下面的一组宏用来操作fd_set的每一位: FD_ZERO(fd_set *