我正在使用Mojave系统将终端仿真库移植到Mac OS。我将poll()与POLLIN一起使用在感兴趣的文件描述符上,然后在poll()说数据准备就绪时调用TIOCINQ ioctl。在Mac OS上,poll()告诉我数据已经准备好,但是当我调用ioctl()来查看有多少字节可读取时,该值为零。
这在Linux和FreeBSD上都可以正常工作。在我意识到poll()或ioctl()给我虚假信息之前,我曾尝试使用iTerm2代替默认终端。那没有帮助。
我通过破坏测试byte_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;