У меня есть приложение-демон, написанное на C, и в настоящее время оно работает без каких-либо известных проблем на компьютере с Solaris 10. Нахожусь в процессе переноса на линукс. Мне пришлось внести минимальные изменения. Во время тестирования он проходит все тестовые случаи. Проблем с его функциональностью нет. Однако, когда я просматриваю загрузку ЦП в режиме ожидания на моей машине с Solaris, он использует около 0,03% ЦП. На виртуальной машине под управлением Red Hat Enterprise Linux 4.8 тот же процесс использует весь доступный ЦП (обычно где-то в диапазоне 90%+).
Моей первой мыслью было, что что-то не так с циклом событий. Цикл событий представляет собой бесконечный цикл (while(1)
) с вызовом select()
. Timeval настроен так, что timeval.tv_sec = 0
и timeval.tv_usec = 1000
. Это кажется достаточно разумным для того, что делает процесс. В качестве теста я увеличил timeval.tv_sec
до 1. Даже после этого я увидел ту же проблему.
Есть ли что-то, что мне не хватает в том, как select работает в Linux и Unix? Или это работает по-разному с ОС, работающей на виртуальной машине? Или, может быть, есть что-то еще, что я полностью упускаю?
Еще одна вещь, я не уверен, какая версия сервера vmware используется. Хотя обновился примерно месяц назад.