unix中select和poll系统调用之间的功能差异

时间:2012-11-01 11:23:26

标签: c++ linux

我很确定在这个问题上人们会很难说这是一个重复的问题。但我打算问一些具体的问题。我面临一个场景,其中一个选择调用无法获得handels,因为轮询系统调用可以识别句柄。

我没有找到任何背后的安抚理由。 让我解释一下情景 - 我试图让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;
            } 

3 个答案:

答案 0 :(得分:2)

我想我不确定你的代码是做什么的。我不知道为什么你while(1)选择函数,但这里有很多问题。请务必阅读select()

的男子

首先,设置超时。如果要等待句柄准备就绪,请将NULL传递给超时值。

其次,每次运行后,select()会修改超时,所以你想要使用它,你必须重写它。您可以使用pselect()来避免这种情况。

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

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

答案 1 :(得分:1)

我怀疑你在代码中有错误或文件描述符在FD_SETSIZE之外(这将是代码中的错误)。在我看过如何实现select / poll的系统中,select是通过将内核中的参数转换为等效的poll调用(或者在旧系统上反之亦然)来实现的。换句话说 - 应该没有功能差异。

答案 2 :(得分:1)

我不确定ACE库,但select系统调用修改其参数。您需要在循环中每次调用select之前重新创建集。