Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 伪终端-未从标准输入中读取_C++_Pty - Fatal编程技术网

C++ 伪终端-未从标准输入中读取

C++ 伪终端-未从标准输入中读取,c++,pty,C++,Pty,我正在创建一个类,在这个类中我可以创建多个作为伪终端的线程,为了与它们中的每一个进行对话,我必须创建多个文件/fifo来与每个伪终端从机进行对话,因为对stdin的访问会使任何创建的伪终端侦听,问题是当使用fifo进行输入时,它不起作用 这是密码 void * Terminal::tTerminal(void * pvParameters) { Terminal (*self) = reinterpret_cast<Terminal*>(pvParameters);

我正在创建一个类,在这个类中我可以创建多个作为伪终端的线程,为了与它们中的每一个进行对话,我必须创建多个文件/fifo来与每个伪终端从机进行对话,因为对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);
        }
}
也就是说它没有设定


谢谢

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

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

self->in
可能比
self->masterFd
大吗?我如何检查?或者你是在谈论他们的int值?@G.Sliepen如果你是在谈论他们的int值masterfd是3,self->in是4谢谢你这就是问题所在,你能解释为什么它需要更大吗?非常感谢;)因为第一个参数告诉
select()
它应该检查哪个filedescriptor。从手册页上看:“nfds是三个集合中编号最高的文件描述符,加上1。”令人惊讶的是,我正在读一本书,但它没有提到这一点;)再说一遍,谢谢你的书:)但是是什么让你首先填写
self->masterFd+1
?它是Linux编程接口,理论上是最好的,也许我误解了这一部分。它什么也没做,只是在ISSET调用中给出了错误,所以当我在中写到self->时,它没有把它发送到self->masterFd
select(std::max(self->masterFd, self->in) + 1, &inFds, &inFds, NULL, NULL)