为什么选择在Linux中使用

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.


Dig*_*oss 7

希望继续运行,同时程序读交互式用户输入1需要是多线程或者他们需要读取输入流认真,具体地,有条件地.

Select(2)可用于实现第二种设计模式.它可以确定是否可以在不阻塞整个应用程序的情况下读取输入.


1.或者其他一些无法预测的输入.

  • 数字表示手动部分:https://unix.stackexchange.com/questions/3586/what-do-the-numbers-in-a-man-page-mean (2认同)