Linux select() vs ppoll() vs pselect()

В моем приложении есть io-поток, предназначенный для

  1. Оборачивания данных, полученных от приложения, в пользовательский протокол
  2. Отправка пакета данных+пользовательский протокол по tcp/ip
  3. Получение пакета данных + пользовательского протокола по TCP/IP.
  4. Распаковка пользовательского протокола и передача данных приложению.

Приложение обрабатывает данные в другом потоке. Кроме того, требования диктуют, что размер неподтвержденного окна должен быть равен 1, т. е. в любой момент времени должно быть только одно ожидающее неподтвержденное сообщение. Это означает, что если io-thread отправил сообщение через сокет, он больше не будет отправлять сообщения, пока не получит подтверждение от получателя. Поток обработки приложения взаимодействует с потоком ввода-вывода через канал. Приложение должно корректно закрываться, если кто-то из Linux CLI набирает ctrl+C. Таким образом, учитывая эти требования, у меня есть следующие варианты

  1. Использовать PPoll() для дескрипторов сокетов и каналов
  2. Использовать Select()
  3. Использовать PSelect()

У меня есть следующие вопросы

  1. Решение между select () и опрос(). Мое приложение имеет дело только с менее чем 50 файловыми дескрипторами. Можно ли предположить, что не будет никакой разницы, выберу ли я выборку или опрос?

    1. Выбор между select() и pselect(). Я прочитал документацию по Linux, и в ней говорится о состоянии гонки между сигналами и select().У меня нет опыта работы с сигналами, поэтому может ли кто-нибудь более четко объяснить состояние гонки и select()? Это как-то связано с тем, что кто-то нажимает Ctrl + C в CLI, и приложение не останавливается?

    2. Выбор между pselect и ppoll() ? Любые мысли по поводу одного и другого

18
задан Thor 15 November 2016 в 08:29
поделиться