unix中选择和轮询系统调用之间的功能差异



我很确定人们会在这个问题上很难说这是一个重复的问题。但是我打算问一些具体的事情。我面临着一个场景,在这种情况下,选择的呼叫未能获取汉德斯,因为民意测验系统可以识别手柄。

我找不到背后任何舒缓的理由。让我解释一下场景 - 我试图让SCOCTENT客户端注册到不在同一台计算机中的服务器。当客户端在同一台计算机中时,选择系统可以有效地工作。但是,当它不是同一台计算机的一部分时,它会失败并有效。

背后有任何一般共鸣吗?(注意:我正在使用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()清除并设置文件描述符。

在ACE库中可能为您抽象了其中的一些,我对此不熟悉,但是通常这些是我看到的部分。

我怀疑您在代码中遇到错误,或者文件描述符在fd_setsize之外(这是代码中的错误)。在我查看如何实现选择/民意调查的系统上,通过将内在的参数转换为等效的民意调查(或较旧的系统中的VICE)来实现选择。换句话说 -

应该没有功能差异。

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

最新更新