Я портирую библиотеку эмуляции терминала на 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;