c++ - unix 中 select 和 poll 系统调用的功能区别

标签 c++ linux

我很确定人们会很难回答这个问题,说这是一个重复的问题。但我打算问一些具体的事情。我遇到了一个场景,其中 select 调用无法获取句柄,而轮询系统调用可以识别句柄。

我没有找到任何安慰的理由。 让我解释一下场景- 我试图让 scocket 客户端注册到不在同一台机器上的服务器。 当客户端在同一台机器上时,选择系统调用会有效地工作。但是当它不是同一台机器的一部分时,它会失败并且轮询工作。

这背后有什么普遍的共鸣吗? (注意:我正在使用 ACE 包装器库) 添加 代码片段

           int noOfHandles = 4;
            int handles[4];

            int result = thedserver->get_handles(handles,noOfHandles);

            if ((result < 0 ) || (noOfHandles <= 0))
            {
                    return -1;
            }
            ACE_Handle_Set dsdHandleSet;

            for( int i = 0 ;  i < noOfHandles ; i++)
            {
                    cout << "handles: " << handles[i] << endl;
                    dsdHandleSet.set_bit(handles[i]);
            }
            cout << "noOfHandles: " << noOfHandles << endl;
            ACE_Time_Value tv1(60, 0);

            while(1)
            {
                    int res = ACE::select(dsdHandleSet.max_set() + 1, &dsdHandleSet, 0, 0,&tv1);
                    cout << "res: " << res << endl;
            } 

最佳答案

我想我不确定您的代码试图做什么。我不知道为什么要 while(1) 选择函数,但这里有很多问题。确保你阅读了 select() 的人

首先,您设置超时。如果您想一直等到句柄准备就绪,请为超时值传递 NULL

其次,每次运行后,select()都会修改超时时间,所以要用,就得重写。您可以使用 pselect() 来避免这种情况。

最后,您应该使用 FD_ZERO()FD_SET() 在调用 select 之前清除和设置文件描述符。

可能其中一些是在 ACE 库中为您抽象的,我对此并不熟悉,但总的来说,这些是我看到的错误/缺失的部分。

关于c++ - unix 中 select 和 poll 系统调用的功能区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13176011/

相关文章:

linux - 在 Linux 中等待多线程事件的最佳实践(如 WaitForMultipleObjects)

c++ - 二进制 '*' : no global operator found which takes type 'statistician' (or there is no acceptable conversion)

c++ - 未定义的行为和顺序点

数组中的 C++ 元素首先被正确读取,然后在没有更改的情况下给出 NaN 这怎么可能?

c++ - 私有(private)构造函数和 make_shared

linux - 如何将 DISPLAY 导出到另一个 linux 主机的 Xserver

linux - 使用 GIT 从 Windows 机器克隆到 Linux 网络服务器(内部)

c++ - 给定一些单词,找到一个序列,使得该序列的任何相邻单词都不能具有相同的字符

python子进程dpkg : I'm getting errors for something that runs in bash

linux - 使用 sed 命令重复字符串中的数字两次