我在看一个串行程序,我发现他们在使用read()之前使用了select().为什么需要这样做.为什么我们不能直接拨打read(),判断它是否失败?还有,为什么我们必须将文件描述符增加1并传递它,而我传递的文件描述符集已经设置为select()

例子:

r=select(fd+1, &fds, NULL, NULL, &timeout);

推荐答案

select()系统调用会告诉您是否有您感兴趣的文件描述符上的任何数据需要读取.严格来说,这是一个文件描述符上的读取操作是否会阻塞的问题.

如果在文件描述符上执行read()(例如连接到串行端口的描述符),并且没有数据可读取,那么调用将挂起,直到有数据可读取为止.使用select()的程序不希望被这样阻止.

你还问:

为什么我们必须将文件描述符增加1并传递它,而我传递的文件描述符已设置为select

这可能是指定FD_集的大小.select()的第一个参数是101,POSIX说:

nfds参数指定要测试的描述符的范围.每组应判断前nfds个描述符;也就是说,应判断描述符集中从零到nfds-1的描述符.

因此,要测试文件描述符nnfds中的值必须至少为n+1.

Linux相关问答推荐

为什么我们不能使用${$#}来获取传递给shell 脚本的最后一个参数?

在c++编译期间,什么是linux命令,它给出了链接库的路径?

Bash:将带有新行的字符串转换为带有逗号、内联的唯一值的字符串

Git在某些文件中添加回车符,尽管autocrlf已关闭

使用 AWK 过滤 Linux 输出

使用 sed 或 awk 在 linux 中将第一行中的一个单词替换为第二行中的另一个单词

如何使用awk或其他方法提取双引号中的子字符串?

为什么 8 位字符串文字可以包含多字节字符,而 char 向量不能?

/usr/local/bin/ 中Collection的权限被拒绝

如何更改目录中所有文件中所有出现的单词

命令列出除 . (点)和..(点点)

从文本文件中删除奇数行或偶数行

如何链接到 GCC 中特定版本的共享库

如何在 Linux 上查找不包含文本的文本文件?

Python日志(log)记录 - 判断日志(log)文件的位置?

在 Unix 上计算每行/字段的字符出现次数

事件驱动和异步有什么区别?在 epoll 和 AIO 之间?

如何使用mv命令移动特定目录中的文件除外?

svn over HTTP 代理

使用 WGET 运行 cronjob PHP