【问题标题】:PseudoTerminal - Not read from stdin伪终端 - 不从标准输入读取
【发布时间】:2017-01-26 19:25:45
【问题描述】:

我正在创建一个类,我可以在其中创建多个作为伪终端的线程,为了与它们中的每一个通信,我必须创建多个文件/Fifos 来与每个伪终端从站通信,因为对标准输入的任务会使任何创建的伪终端听,问题是当使用先进先出输入时它不起作用。

这里是代码

void * Terminal::tTerminal(void * pvParameters)
{
    Terminal (*self) = reinterpret_cast<Terminal*>(pvParameters);
    fd_set inFds;
    //dup2(self->in, STDIN_FILENO);
    for (;;)
    {
        FD_ZERO(&inFds);
        FD_SET(self->in, &inFds);
        FD_SET(self->masterFd, &inFds);
        if (select(self->masterFd + 1, &inFds, &inFds, NULL, NULL) == -1)
        {
            printf("select");
        }


        if (FD_ISSET(self->in, &inFds))
        {
            self->numRead = read(self->in, self->buf, BUF_SIZE);
            if (self->numRead <= 0)
                exit(EXIT_SUCCESS);

            if (write(self->masterFd, self->buf, self->numRead) != self->numRead)
                printf("partial/failed write (masterFd)");
        }
        else
        {
            printf("partial/failed write (masterFd)");
            fflush(stdout);
        }

        if (FD_ISSET(self->masterFd, &inFds))
        {
            self->numRead = read(self->masterFd, self->buf, BUF_SIZE);
            if (self->numRead <= 0)
                exit(EXIT_SUCCESS);

            if (write(self->out, self->buf, self->numRead) != self->numRead)
                printf("partial/failed write (STDOUT_FILENO)");
        }
        else
        {
            printf("partial/failed write (STDOUT_FILENO)");
            fflush(stdout);
        }
}

进一步注意Fifos创建正确,文件描述符不为0,master和slave都在运行,唯一的问题是:

FD_ISSET(self->in, &inFds)

表示没有设置,

谢谢

【问题讨论】:

  • self-&gt;in 可能比self-&gt;masterFd 大吗?
  • 我该如何检查?还是您在谈论它们的 int 值?
  • @G.Sliepen 如果你在谈论他们的 int 值 masterfd 是 3 而 self->in 是 4

标签: c++ pty


【解决方案1】:

您应该确保select() 的第一个参数是所有可能的文件描述符中的最高加一个,所以:

select(std::max(self->masterFd, self->in) + 1, &inFds, &inFds, NULL, NULL)

【讨论】:

  • 谢谢这是问题所在,你能解释一下为什么它需要更大吗?非常感谢;)
  • 因为第一个参数告诉select() 它应该检查哪个文件描述符。来自手册页:“nfds 是三组中任何一个中编号最高的文件描述符,加 1。”
  • 太棒了,我正在读一本书,但它什么也没说;)再次感谢
  • 糟糕的书 :) 但是是什么让你首先填写self-&gt;masterFd + 1
  • 这是 Linux 编程接口,理论上是最好的之一,也许我误读了那部分。它什么也没做,只是在 ISSET 调用中给出了错误,所以当我写信给 self->in 时,它没有将它发送给 self->masterFd
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2020-04-18
  • 2022-08-16
  • 2013-03-30
  • 2012-02-17
  • 2017-06-17
  • 2015-07-05
相关资源
最近更新 更多