Вам нужно будет сделать memcpy (или что-то эквивалентное), если вы не можете сделать это так, чтобы данные в (buf) никогда не были нужны после возврата pushWork ().Если вы можете позволить себе всю обработку данных буфера внутри pushWork (), OTOH, копирование буфера не требуется.
Другой альтернативой может быть выделение буфера из кучи заранее каждый раз через цикл epoll и чтение () непосредственно в этот буфер вместо чтения в буфер в стеке ... таким образом, динамическивыделенный буфер будет по-прежнему доступен для использования после того, как цикл обработки событий перейдет к другим вещам.Обратите внимание, что выполнение этого откроет путь к возможным утечкам памяти или ее исчерпанию, поэтому вам следует быть осторожным, чтобы избежать этих проблем.
Что касается "C ++-способа", яЯ уверен, что они есть, но я не знаю, что они обязательно улучшат вашу программу.Способ C работает нормально, зачем исправлять то, что не сломано?
(Еще одна вещь, на которую следует обратить внимание: если вы используете неблокирующий ввод / вывод, тогда read () будет иногда читать и возвращать меньше, чем BUF_SIZEбайты, в этом случае вам понадобится логика для обработки этой возможности. Если вы используете блокирующий ввод / вывод, OTOH, read () иногда будет блокироваться на длительные периоды (например, если клиентский компьютер умирает, отправив только половину буфера)который заблокирует ваш цикл epoll и сделает его не отвечающим, возможно, на несколько минут. Это более сложная проблема, поэтому я обычно заканчиваю тем, что использую неблокирующий ввод / вывод, даже если получить больший боль становится правильным.