问题标签 [select-syscall]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
986 浏览

linux - 在 Linux 中将阻塞(没有 O_NONBLOCK)文件描述符用于选择/轮询是否合适?

错误

在 Linux 下,select() 可能会将套接字文件描述符报告为“准备好读取”,但随后会出现读取块。例如,当数据到达但检查时校验和错误并被丢弃时,可能会发生这种情况。可能存在文件描述符被虚假报告为就绪的其他情况。因此,
在不应阻塞的套接字上使用 O_NONBLOCK 可能更安全。

但是我看到netcat,,socatwget但不是curl)将没有 O_NONBLOCK 的 FD 用于选择或轮询。

我已经实现了一个特殊的库来测试应用程序,但它们失败了......

/* 灵感来自于看到一个来自陈旧套接字的挂起wget并且read没有像它应该的那样超时 */

我应该将此报告为错误还是他们做得对?

可能的答案:

  1. “不,在 poll/select => bug 中阻塞 FD”;
  2. “只有 AF_INET[6] 套接字在选择时可能会失火,因此只有在阻塞网络套接字处于轮询/选择中时才会出现错误”;
  3. “是的,仅当/当您因此而看到实际失败时才报告错误”(例如在 wget 中)。
0 投票
3 回答
32627 浏览

c - 为什么在 Linux 中使用 select

我正在通过一个串行程序,我观察到他们select()在使用read(). 为什么需要这样做。为什么我们不能直接调用read()并检查它是否失败?另外,为什么我们必须将文件描述符增加 1 并在我将文件描述符集传递给时传递它select()

例子:

r=select(fd+1, &fds, NULL, NULL, &timeout); 其中 fds 已经具有 fd 的值

0 投票
2 回答
131 浏览

c - 我可以使用 select 在多个接口上以接口可以处理的速度发送数据吗

我是一位经验丰富的网络程序员,面临需要一些建议的情况。

我需要在几个传出接口上分发一些数据(通过不同的 tcp 套接字连接,每个连接对应于每个接口)。但是,重要的部分是,我应该能够在具有更好带宽的接口上发送更多/大部分数据,即可以更快发送的数据。

我的意见是为此目的使用select api(unix和windows)。我过去使用过 select、poll 甚至 epoll。但只要数据可用,它总是用于从多个套接字读取。

在这里,我打算按顺序在几个接口上写入连续的数据包,然后监视每个接口的写入描述符(选择参数),然后哪个可用(意味着它能够先发送数据包),我将继续发送更多数据包通过那个描述符。

我能在这里实现我的意图吗?即,如果我有一个 10Mbps 链路的接口与另一个 1Mbps 链路的接口,我希望能够通过更快的接口获取大部分数据包。

更新 1:我想知道在这种情况下 select 的行为是什么,即当您在读取描述符上调用 select 时,会返回数据可用的那个。但是,在我的场景中,当我们在描述符上写入并等待 select 返回首先完成写入的描述符时,select 是否确保仅在写入整个数据包时才返回,即说我尝试一次写入 1200 个字节。它只会在全部 1200 都返回或出现永久性错误时返回吗?我不确定 select 会如何表现,也没有找到任何描述它的文档。

0 投票
1 回答
88 浏览

c++ - 如何在 sys/select.h 中正确使用

在以下代码中使用计时器时,要么"Error calling select"出现错误,要么出现新数据:

为了避免在重新访问此代码时出现此错误,可以在客户端执行哪些操作而不中断会话?

0 投票
1 回答
270 浏览

c - strace 选择的“左”字段是什么意思?

我正在使用 strace 来调查进程的 select 系统调用,并试图弄清楚是什么left意思。在从 strace 日志中提取的调试行下方找到。

到目前为止,我在可用文档中没有找到任何内容。