【问题标题】:Creating a pseudo terminal in C++ that can be used by other programs在 C++ 中创建一个可供其他程序使用的伪终端
【发布时间】:2017-02-16 12:19:35
【问题描述】:

我使用以下代码在 C++ 中创建了一个伪终端:

int main(int, char const *[])
{
  int master, slave;
  char name[1024];
  char mode[] = "0777"; //I know this isn't good, it is for testing at the moment
  int access;

  int e = openpty(&master, &slave, &name[0], 0, 0);
  if(0 > e) {
    std::printf("Error: %s\n", strerror(errno));
    return -1;
  }

  if( 0 != unlockpt(slave) )
  {
      perror("Slave Error");
  }

  access = strtol(mode, 0, 8);

  if( 0 > chmod(name, access) )
  {
      perror("Permission Error");
  }

  //std::cout << "Master: " << master << std::endl;
  std::printf("Slave PTY: %s\n", name);

  int r;
  prompt = "login: ";

  while(true) 
  {
    std::cout << prompt << std::flush;
    r = read(master, &name[0], sizeof(name)-1);
    checkInput(name);
    name[r] = '\0';
    std::printf("%s", &name[0]);
    std::printf("\n");
  }

  close(slave);
  close(master);

  return 0;
}

从另一个终端我可以做的意义上来说,它工作得很好:

printf '用户名' > /dev/pts/x

它将按应有的方式显示和处理。

我的问题是:当我尝试使用屏幕时,屏幕终端上什么也没有出现。然后当我输入时,它会一次传递给我的奴隶 1 个字符。

有人知道这是为什么吗?或者我该如何解决它。

如果需要,我可以提供更多详细信息。

谢谢你:)

【问题讨论】:

    标签: c++ linux pty


    【解决方案1】:

    因为您在使用printf 后没有刷新缓冲区。

    【讨论】:

    • 这是否意味着我需要告诉从属设备在它进行任何处理之前等待我刷新?
    【解决方案2】:

    正如保罗回答已经建议您需要刷新缓冲区。

    为此,您可以使用 tcflush 函数。

    第一个参数是文件描述符的 int,第二个可以是以下之一:

    • TCIFLUSH 刷新系统已经接收到的输入数据,但是 未被应用程序读取。

    • TCOFLUSH 刷新由应用程序写入的输出数据 但未发送到终端。

    • TCIOFLUSH 同时刷新输入和输出数据。

    更多信息请见:https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-tcflush-flush-input-output-terminal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2012-12-11
      • 2020-05-31
      相关资源
      最近更新 更多