Короче, не делайте этого, если вам действительно не нужен код для переносимости. Если вы это сделаете, то используйте чистые API POSIX, из которых около миллиарда примеров и сайтов доступны для справки.
Вам будет гораздо лучше придерживаться более высокого уровня, основанного на обратном вызове, API-интерфейсов, использующих циклы выполнения и / или очереди. Меньше кода. Проще поддерживать. Более эффективный (в том смысле, что он лучше интегрирован с платформой).
Если вы все еще думаете, что вам нужно идти по пути без обратных вызовов, объясните, почему. Имейте в виду, что синхронный код - это просто асинхронный код, который блокирует ожидание обратного вызова ....