当前位置: 技术问答>linux和unix
fork,select,fd_set是什么关系
来源: 互联网 发布时间:2016-05-09
本文导语: 看了UNIX网络编程的书 学会2种处理SOCKET多进程的方法,一个是FORK制造进程,一个是SELECT多路复用,其中用到了FD_SET的描述字符集 那如果我想将SELECT的方法换成FORK,那FD_SET是不是也可以用在FORK里呢? 搞不清这3个之间...
看了UNIX网络编程的书
学会2种处理SOCKET多进程的方法,一个是FORK制造进程,一个是SELECT多路复用,其中用到了FD_SET的描述字符集
那如果我想将SELECT的方法换成FORK,那FD_SET是不是也可以用在FORK里呢?
搞不清这3个之间的关系了,望高手以易懂的方法解释下,谢谢
学会2种处理SOCKET多进程的方法,一个是FORK制造进程,一个是SELECT多路复用,其中用到了FD_SET的描述字符集
那如果我想将SELECT的方法换成FORK,那FD_SET是不是也可以用在FORK里呢?
搞不清这3个之间的关系了,望高手以易懂的方法解释下,谢谢
|
在网上找到了点资料,并发服务器的实现,讲到了多路I/O复用的(是乎网上这方面的资料好少啊),貌似有点理解了,不过还没试过.
下面是我找到的一此资料的一部分内容:
9.4 并发服务器:多路复用I/O
为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型.
首先介绍一个函数select
int select(int nfds,fd_set *readfds,fd_set *writefds,
fd_set *except fds,struct timeval *timeout)
void FD_SET(int fd,fd_set *fdset)
void FD_CLR(int fd,fd_set *fdset)
void FD_ZERO(fd_set *fdset)
int FD_ISSET(int fd,fd_set *fdset)
一般的来说当我们在向文件读写时,进程有可能在读写出阻塞,直到一定的条件满足. 比
如我们从一个套接字读数据时,可能缓冲区里面没有数据可读(通信的对方还没有 发送数
据过来),这个时候我们的读调用就会等待(阻塞)直到有数据可读.如果我们不 希望阻塞
,我们的一个选择是用select系统调用. 只要我们设置好select的各个参数,那么当文件
可以读写的时候select回"通知"我们 说可以读写了. readfds所有要读的文件文件描述
符的集合
writefds所有要的写文件文件描述符的集合
exceptfds其他的服要向我们通知的文件描述符
timeout超时设置.
nfds所有我们监控的文件描述符中最大的那一个加1
在我们调用select时进程会一直阻塞直到以下的一种情况发生. 1)有文件可以读.2)有文
件可以写.3)超时所设置的时间到.
为了设置文件描述符我们要使用几个宏. FD_SET将fd加入到fdset
FD_CLR将fd从fdset里面清除
FD_ZERO从fdset中清除所有的文件描述符
FD_ISSET判断fd是否在fdset集合中
使用select的一个例子
int use_select(int *readfd,int n)
{
fd_set my_readfd;
int maxfd;
int i;
maxfd=readfd[0];
for(i=1;imaxfd) maxfd=readfd[i];
while(1)
{
/* 将所有的文件描述符加入 */
FD_ZERO(&my_readfd);
for(i=0;i
下面是我找到的一此资料的一部分内容:
9.4 并发服务器:多路复用I/O
为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型.
首先介绍一个函数select
int select(int nfds,fd_set *readfds,fd_set *writefds,
fd_set *except fds,struct timeval *timeout)
void FD_SET(int fd,fd_set *fdset)
void FD_CLR(int fd,fd_set *fdset)
void FD_ZERO(fd_set *fdset)
int FD_ISSET(int fd,fd_set *fdset)
一般的来说当我们在向文件读写时,进程有可能在读写出阻塞,直到一定的条件满足. 比
如我们从一个套接字读数据时,可能缓冲区里面没有数据可读(通信的对方还没有 发送数
据过来),这个时候我们的读调用就会等待(阻塞)直到有数据可读.如果我们不 希望阻塞
,我们的一个选择是用select系统调用. 只要我们设置好select的各个参数,那么当文件
可以读写的时候select回"通知"我们 说可以读写了. readfds所有要读的文件文件描述
符的集合
writefds所有要的写文件文件描述符的集合
exceptfds其他的服要向我们通知的文件描述符
timeout超时设置.
nfds所有我们监控的文件描述符中最大的那一个加1
在我们调用select时进程会一直阻塞直到以下的一种情况发生. 1)有文件可以读.2)有文
件可以写.3)超时所设置的时间到.
为了设置文件描述符我们要使用几个宏. FD_SET将fd加入到fdset
FD_CLR将fd从fdset里面清除
FD_ZERO从fdset中清除所有的文件描述符
FD_ISSET判断fd是否在fdset集合中
使用select的一个例子
int use_select(int *readfd,int n)
{
fd_set my_readfd;
int maxfd;
int i;
maxfd=readfd[0];
for(i=1;imaxfd) maxfd=readfd[i];
while(1)
{
/* 将所有的文件描述符加入 */
FD_ZERO(&my_readfd);
for(i=0;i