当POLLIN说Mac OS(mojave)上有TIOCINQ时,为什么TIOCINQ返回0字节准备好?

时间:2019-06-06 18:25:58

标签: c macos terminal

我正在使用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;

0 个答案:

没有答案