Проблема с прекращающимся циклом на С

друзья! Есть проблема с циклом While, задача:

Считывать нажатие средней (колесо), левой и правой кнопок мыши и выводить на экран факты нажатия. Завершить работу с устройством по кручению колеса мыши

Программа работает, но во первых: 1) Не получается сделать так чтобы во время непосредственно цикла выводились в консоль только левая (1) правая (10) и центральная кнопки (100) но происходит что забивается память(на сколько понимаю) и в определенный момент перестает считывать нажатия, пауза примерно секунд 15 идёт, после чего начинает нормально работать и так по кругу, в чем может быть проблема? Может кто нибудь подскажет более простое решение этого отображения? Заранее спасибо, товарищи! Весь код ниже: На Linux Mint 19 верси запускаю, все библиотеки прописаны естественно. libusb - библиотека для работы с USB устройствами в данном варианте.

Но когда зажимаешь любую кнопку мыши и перемещаешь его отображается целая серия строк с нажатой кнопкой в консоли

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <libusb-1.0/libusb.h>
#include <stdbool.h>
#include <string.h>

struct libusb_device_descriptor devDescriptor;                                                      // Глобальные переменные ( структуры )
struct libusb_config_descriptor* configDescriptor;                                                  // ->
struct libusb_interface_descriptor *interface;                                                      // ->

/// PATH     usr/include/libusb-1.0/libusb.h
// gcc -o main main.c -lusb-1.0 - запуск с параметрами 

int count;                                                                                          // Глобальная переменная ( количества устройств )

int IO_VID;                                                                                         // ГП. для присвоения VendorID устройства
int IO_PID;                                                                                         // ГП. для присвоения PID устройства

void main() {                                                                                       // Функция, точка входа в программу
    int i, j;                                                                                       // Объявление локальных переменных
    char string[256];                                                                               // ->
    bool state;                                                                                     // ->
    int task;                                                                                       // ->
    int x = 0, y = 0, tx, ty;                                                                       // ->
    int dWheel;                                                                                     // ->
    char temp_left, temp_right, temp_middle;

    unsigned char bytes[8] = { 0 };                                                                 // ->

    libusb_device **devList;                                                                        // ->
    libusb_device *device = NULL;                                                                   // ->
    libusb_device_handle *devHandle;                                                                // ->

    printf("Введите 1 для запуска:\n");                                                             // Вывод информации, далее тоже самое
    printf("  1. Считывать нажатие средней (колесо), левой и правой кнопок мыши и выводить на экран факты нажатия. Завершить работу с устройством по кручению колеса мыши;\n");
    scanf("%d", &task);                                                                             // Ожидаем вводимое целое число
    printf("Задание #%d\n", task);                                                                  // Вывод информации

    if (task == 0 || task == 1) {                                                       // Условие для использования по заданию нужный VID, PID; Условие используеющее мышь
        IO_VID = 0x046d;                                                                            // Запись в переменную VID мышь
        IO_PID = 0xc077;                                                                            // Запись в переменную PID мышь
    }


    if (libusb_init(NULL) != 0) {                                                                   // Инитилизация билбиотеки LibUsb
        printf("Невозможно инитилизировать библиотеку libusb\n");                                   // Вывод информации об ошибке
        return;                                                                                     // Выход из программы
    }

    count = libusb_get_device_list(NULL, &devList);                                                 // Получение количества устройств

    printf("VID-PID Нашей мышки:\n");                                                           // Вывод информации
    //printf("------------------------------------------------------------------------------------------------\n");
    for (i = 0; i < count; i++) {                                                                   // Цикл For со счетчиком
        if (libusb_get_device_descriptor(devList[i], &devDescriptor) == 0) {                        // Запрашиваем дескриптора устройства
            if (libusb_open(devList[i], &devHandle) == LIBUSB_SUCCESS) {                            // Открываем устройство
                if (devDescriptor.idVendor == IO_VID) {
                  printf("  VID this Mouse:                 %04x\n", devDescriptor.idVendor);                   // Вывод информации о устройстве
                  printf("  PID this Mouse:                 %04x\n", devDescriptor.idProduct);                  // Вывод информации о устройстве
               }
            }
            //printf("------------------------------------------------------------------------------------------------\n");

            if (devDescriptor.idVendor == IO_VID && devDescriptor.idProduct == IO_PID) {            // Условие на поиск устройства
                device = devList[i];                                                                // Запись в переменную номера найденого устройства
            }
            libusb_close(devHandle);                                                                // Закрываем дескриптор устройства
        }
    }
    if (device == NULL) {                                                                           // Условие при ошибке поиска устрйоства
        printf("Не найдено устройство\n");                                                          // Вывод информации с ошибкой
        return;                                                                                     // Выход из программы
    }

    if (libusb_open(device, &devHandle) != LIBUSB_SUCCESS) {                                        // Открываем дескриптор устройства
        printf("Невозможно подключится к найденному устройству\n");                                 // Вывод информации с ошибкой
        return;                                                                                     // Выход из программы
    }

    libusb_free_device_list(devList, 0);                                                            // Отчищаем список устройств

    printf("Нажмите Enter для продолжения");                                                        // Вывод информации

    getchar(); getchar();                                                                           // Ожидаем клавиши Enter для выполнения задания

    if ( libusb_kernel_driver_active(devHandle, 0) == 1) {                                          // Проверка на захват ядром устройства
        printf("Устройство захвачено ядром ОС\n");                                                  // Вывод информации
        libusb_detach_kernel_driver(devHandle, 0);                                                  // Отсоединить устрйоства от ядра
        printf("Устройство отсоединено от ядра\n");                                                 // Вывод информации
    }

    if (libusb_claim_interface(devHandle, 0) < 0) {                                                 // Захват интерфейса устрйоства
        printf("Захват интерфейса устройства - ошибка");                                            // Вывод информации с ошибкой
        return;                                                                                     // Выход из программы
    }

    if (task == 1) {                                                                                // Выполнение 1 задания
        **

    while(true){                                                                                // Бесконечный цикл
                if (libusb_interrupt_transfer(devHandle, 0x81, bytes, sizeof(bytes), 0, 0) >= 0) {      // Ожидание получения пакета от мыши
                    if ((0b00000001 == bytes[0])) {
                          printf("Левая кнопка мыши\n");
                    }
                      for (int i = 0; i < 8; i++) {
                        printf("%s", (bytes[0] & 0x80) ? "1" : "0");
                        bytes[0] <<= 1;
                      }
                    printf("\n");
                    printf("data: %d\n",bytes[0]);


                    if (0b00001111 & bytes[3]) {                                                        // При прокрутки колесика мыши выход из цикла
                        break;                                                                          // Выход из цикла

**
                }                                                                           // Выход из цикла
            }
        }
    }

    libusb_release_interface(devHandle, 0);                                                         // Закрытие захваченого интерфейса
    libusb_attach_kernel_driver(devHandle, 0);                                                      // Прикрепление к ядру 
    libusb_close(devHandle);                                                                        // Отключить библиотеку libUsb
    libusb_exit(NULL);                                                                              // ->
}

// gcc -I/usr/include/libusb-1.0/ main.c -o main -lusb-1.0

есть второй вариант того цикла:

Кстати, есть более адекватный цикл: но в нем те же проблемы присутстуют...

if (task == 1) {
    while(true){
        if (libusb_interrupt_transfer(devHandle, 0x81, bytes, sizeof(bytes), 0, 10000) >= 0) {
            printf("Левая кнопка мыши: %03d\n", (0b00000001 & bytes[0]) );
            printf("Правая кнопка мыши: %03d\n",  (0b00000010 & bytes[0]) );
            printf("Средняя кнопка мыши: %03d\n", (0b00000100 & bytes[0])); 
            if (0b00001111 & bytes[3]) {
                break;
            }
        }else{
            break;
        }
    }

Ответы (0 шт):