В POSIX диски считаются «быстрыми устройствами», что означает, что они всегда блокируют (вот почему O_NONBLOCK не работал для вас).Только сетевые сокеты могут быть неблокирующими.
Существует POSIX AIO, но, например, в Linux, который имеет множество ограничений, делающих его непригодным для общего назначения (только для O_DIRECT, ввод / вывод должен быть выровнен по секторам).
Если вы хотите интегрировать обычный POSIX IO в асинхронный цикл событий, кажется, что люди прибегают к пулам потоков, где блокирующие системные вызовы выполняются в фоновом режиме одним из рабочих потоков.Одним из примеров такой библиотеки является libeio