PseudoTerminal - 不从stdin读取

时间:2017-01-26 19:25:45

标签: c++ pty

我正在创建一个类,我可以在其中创建多个伪终端线程,为了与它们中的每一个进行通信,我必须创建多个文件/ Fifos来与每个伪终端从属进行通信,因为对stdin进行了详细说明任何创建的伪终端听,问题是当使用fifo输入时它不起作用。

这是代码

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,主服务器和从服务器正在运行,唯一的问题是:

FD_ISSET(self->in, &inFds)

这意味着它没有设置,

由于

1 个答案:

答案 0 :(得分:1)

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

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