2010-06-23 15 views
5

Ich hatte den Eindruck, dass boost :: asio standardmäßig eine epoll-Installation anstelle einer ausgewählten Implementierung verwenden würde, aber nach einigen Tests sieht es so aus, als würde meine Installation select verwenden.Boost Asio Unter Linux nicht mit Epoll

OS: RHEL 4
Kernel: 2.6
GCC: 3.4.6

ich ein kleines Testprogramm geschrieben, der Reaktor-Header, um sicherzustellen, wurde verwendet, und es sieht aus wie sein den Auswahlreaktor statt der Epollreaktor.

#include <boost/asio.hpp> 

#include <string> 
#include <iostream> 

std::string output; 

#if defined(BOOST_ASIO_EPOLL_REACTOR_HPP) 

int main(void) 
{ 
    std::cout << "you have epoll enabled." << std::endl; 
} 

#elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP) 

int main(void) 
{ 
    std::cout << "you have select enabled." << std::endl; 
} 

#else 

int main(void) 
{ 
    std::cout << "this shit is confusing." << std::endl; 
} 


#endif 

Was könnte ich falsch machen?

Antwort

4

Ihr Programm sagt "select" auch für mich, aber asio verwendet epoll_wait(), wie ps -Teo tid,wchan:25,comm berichtet.

Wie wäre es

#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
int main() 
{ 
std::string output; 
#if defined(BOOST_ASIO_HAS_IOCP) 
    output = "iocp" ; 
#elif defined(BOOST_ASIO_HAS_EPOLL) 
    output = "epoll" ; 
#elif defined(BOOST_ASIO_HAS_KQUEUE) 
    output = "kqueue" ; 
#elif defined(BOOST_ASIO_HAS_DEV_POLL) 
    output = "/dev/poll" ; 
#else 
    output = "select" ; 
#endif 
    std::cout << output << std::endl; 
} 

(der Leiter von ifdefs von /usr/include/boost/asio/serial_port_service.hpp packte)

+0

Dieser Code gedruckt "select" für mich. Nach einigen Grabungen in epoll_reactor_fwd.hpp und einigen weiteren Tests gibt der LINUX_VERSION_CODE eine Version zurück, die kleiner als 2.4.45 ist (was offensichtlich nötig ist, um epoll zu verwenden). uname -r gibt folgende Formel: $ uname -r 2.6.9-78.0.13.ELsmp Wenn Narr mit der erforderlichen Kernel in epoll_reactor_fwd.hpp ich Ihr Programm zur Ausgabe von "epoll" bekommen kann. Ist das ein Fehler bei der Serverkonfiguration? –

+0

In der Tat scheint so. Mein Dev-System gibt LINUX_VERSION_CODE als 132639 oder KERNEL_VERSION (2,6,31) aus (und es wurde mit 2.6.31.5 ausgeliefert - es ist ein OpenSUSE). Was würde passieren, wenn Sie den Boost von der Quelle wiederherstellen? – Cubbi

+0

Boost.Asio ist nur Kopfzeile, ich bezweifle, Wiederaufbau Boost wird dazu beitragen. –