在C 中创建一个可以由其他程序使用的伪终端

Creating a pseudo terminal in C++ that can be used by other programs

本文关键字:程序 其他 终端 创建 一个      更新时间:2023-10-16

我使用以下代码在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: %sn", 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: %sn", name);
  int r;
  prompt = "login: ";
  while(true) 
  {
    std::cout << prompt << std::flush;
    r = read(master, &name[0], sizeof(name)-1);
    checkInput(name);
    name[r] = '';
    std::printf("%s", &name[0]);
    std::printf("n");
  }
  close(slave);
  close(master);
  return 0;
}

从另一个终端我可以做的是:

,它的工作原理非常好。

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

它将出现并按照应有的方式进行处理。

我的问题是:当我尝试使用屏幕时,屏幕终端上没有任何内容。然后,当我输入时,它一次贯穿我的从1个字符。

有人知道为什么这是吗?或我如何修复它。

如果需要,我可以提供更多细节。

谢谢:)

,因为您使用printf后没有冲洗缓冲区。

pauls答案已经表明您需要冲洗缓冲区。

这样做,您可以使用tcflush函数。

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

  • tciflush冲洗系统已收到的输入数据,但不通过应用程序阅读。

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

  • tcioflush冲洗输入和输出数据。

有关更多信息,请参见: https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-tcflush-flush-flush-input-input-input-unput-xtup-terminal

相关文章: