use*_*307 37 c linux file-descriptor select-syscall
我正在通过一个连续程序,我观察到他们在使用select()之前使用read().为什么这是必需的.为什么我们不能直接调用read()并检查它是否失败?另外,为什么我必须将文件描述符增加1并在我传递文件描述符集时传递它select()?
例:
r=select(fd+1, &fds, NULL, NULL, &timeout);
其中fds已经具有fd的值
Jon*_*ler 44
该select()系统调用告诉你是否有任何数据就可以在自己感兴趣的文件描述符读取.严格来说,它是文件描述符的读操作是否会阻止或不是一个问题.
如果执行read()文件描述符(例如连接到串行端口的文件描述符)并且没有要读取的数据,则调用将挂起,直到有一些数据要读取.使用的程序select()不希望被阻止.
你也问:
为什么我必须将文件描述符增加1并在我传递文件描述符集时传递它
select?
这可能是指定FD_SET的大小,但可能做得很糟糕.第一个参数select()被称为nfds和POSIX说:
的
nfds参数指定要测试的描述符的范围.nfds应在每组中检查第一个描述符; 也就是说,nfds-1应检查描述符集中从零到一的描述符.
因此,要测试文件描述符n,值nfds必须至少为n+1.
| 归档时间: |
|
| 查看次数: |
28642 次 |
| 最近记录: |