read()不会从pty读取数据

时间:2019-02-03 10:59:54

标签: unix pty

我的程序应该模拟通常通过COM端口(/ dev / ttyUSB0)连接的外部设备。该程序会打开一个pty并等待命令。这是代码:

HostPty::HostPty(const string & HostPty_name)
{
    char name[100] = {0};
    int res = openpty(&_master, &_slave, name, NULL, NULL);
    printf("Name: %s\n", name);
}

string HostPty::nextString()
{
    static const int BUF_SIZE = 4096;
    char buf[BUF_SIZE];
    size_t idx = 0;

    while(true)
    {
        // Read symbols one by one until new line is found
        size_t received_size = read(_master, buf + idx, 1);
        printf("Received a symbol: %02x\n", buf[idx]);

        // Stopping at new line
        if(buf[idx] == '\n')
            break;

        idx++;
    }

    return string(buf, idx);
}

要测试此代码,我使用miniterm.py终端仿真器,该仿真器连接到/ dev / pty / 6(或使用openpty创建的任何文件),并在该处发送文本命令。

当我手动键入命令时,所有功能都可以正常工作-我按预期的方式收到字符。但是,当我粘贴多行文本时,此代码仅收到第一个字节,直到我放置新的行符号(即使我粘贴的文本中有多个换行符号)。

有什么解决办法吗?

1 个答案:

答案 0 :(得分:1)

  

有什么解决办法吗?

我不知道您使用哪种Unix。我只是想在Linux下重现您的问题。但是粘贴行在我的计算机上可以正常工作,所以我无法重现该问题。

如果您的Unix变体具有系统调用跟踪程序(Linux:strace,SunOS / Solars:truss,FreeBSD:strace,MacOS:dtruss(?) ,我将跟踪系统调用:

strace -f -o file_myprog.out ./my_program

miniterm /dev/pty/6

(请注意-f,这也调试了fork()创建的子流程的系统调用。这是必需的,因为Python会创建此类子流程。)

现在重现程序无法正常运行的情况,并使用my_program杀死pkill -KILL my_program。 (发送-KILL信号以确保my_program立即被杀死。)

再做一次-这次调试miniterm并在“错误情况”下杀死miniterm

./my_program

strace -f -o file_miniterm.out miniterm /dev/pty/6

在两个输出文件(file_myprog.outfile_miniterm.out)的末尾,您可以看到两个程序在杀死它们之前的最后“动作”。可能有多种情况:

  • miniterm正在将数据发送到/dev/pty/6,但是您的程序未收到任何数据。在这种情况下,虚拟控制台本身存在问题。
  • miniterm由于某种原因未将数据发送到/dev/pty/6。在这种情况下,您遇到miniterm的问题。
  • miniterm甚至没有收到使用read() ...
  • 粘贴的数据