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