Почему TIOCINQ возвращает 0 готовых байтов, когда POLLIN говорит, что в Mac OS есть (mojave)? - PullRequest
0 голосов
/ 06 июня 2019

Я портирую библиотеку эмуляции терминала на Mac OS, используя систему Mojave. Я использую poll () с POLLIN в интересующем файловом дескрипторе, а затем вызываю TIOCINQ ioctl, когда poll () сообщает, что данные готовы. В Mac OS функция poll () сообщает мне, что данные готовы, но когда я вызываю ioctl (), чтобы узнать, сколько байтов доступно для чтения, значение равно нулю.

Это работает, как и ожидалось, как в Linux, так и во FreeBSD. Прежде чем я понял, что poll () или ioctl () дают мне ложную информацию, я попытался использовать iTerm2 вместо терминала по умолчанию. Это не помогло.

Я сузил проблему, разбив условные выражения, проверяющие значение bytes_peek == 0.

    fd_array[0].fd = vterm->pty_fd;
    fd_array[0].events = POLLIN;

    // wait 10 millisecond for data on pty file descriptor.
    retval = poll(fd_array, 1, 10);

    // no data or poll() error.
    if(retval <= 0)
    {
        if(errno == EINTR) return 0;
        return retval;
    }

    retval = 0;
    bytes_peek = 0;

#ifndef TIOCINQ
    retval = ioctl(vterm->pty_fd, FIONREAD, &bytes_peek);
#else
    retval = ioctl(vterm->pty_fd, TIOCINQ, &bytes_peek);
#endif

    if(retval == -1) return 0;
    if(bytes_peek == 0) return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...