Единственный способ, которым я могу придумать, заключается в том, чтобы ваша программа (одно чтение) считывала всю информацию в FIFO - то есть указатель чтения в вашей программе всегда находится в конце канала. Когда сообщение прочитано, вы добавите его во внутренний список сообщений (то есть в очередь или что-то подобное). Вы также будете поддерживать указатель на последнее прочитанное сообщение.
Считывание последней строки и отбрасывание всех остальных - это просто процесс отслеживания указателя на последнее сообщение и, при желании, очистки очереди.
Проблемы здесь заключаются в том, что ваша внутренняя очередь может стать большой, и вам потребуется контроль параллелизма для указателей очереди и последнего сообщения. Я хотел бы, чтобы читатель FIFO в своем собственном потоке ничего не делал, кроме как слушал трубку. Когда приходит сообщение, вам нужно заблокировать очередь, добавить новое сообщение и обновить указатель последнего сообщения, а затем снять блокировку. Убедитесь, что вы обрабатываете все доступные входящие сообщения перед снятием блокировки. В потоке, выполняющем обработку, вы должны заблокировать очередь для работы с ней. Убедитесь, что вы блокируете очередь не дольше, чем это необходимо, иначе у вас будут проблемы с производительностью.