阅读()不从PTY读取数据,尽管它们是

问题描述 投票:0回答:1

我的程序是应该以仿真通常通过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创建)和发送文本命令在那里。

当我键入命令手动一切工作正常 - 我收到字符一一预期。但是,当我粘贴了一块多行文本的,直到我把一个新的线符号(即使有在我将文本粘贴多个新行符号)这段代码只接收第一个字节。

任何想法如何解决呢?

unix pty
1个回答
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()粘贴的数据...
© www.soinside.com 2019 - 2024. All rights reserved.