伪终端 - 不从标准输入读取
PseudoTerminal - Not read from stdin
我正在创建一个 class,我可以在其中创建多个伪终端线程,为了与它们中的每一个对话,我必须创建多个文件/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,master和slave是运行,唯一的问题是:
FD_ISSET(self->in, &inFds)
表示没有设置,
谢谢
您应该确保 select()
的第一个参数是所有可能的文件描述符中 最高的 加上一个,因此:
select(std::max(self->masterFd, self->in) + 1, &inFds, &inFds, NULL, NULL)
我正在创建一个 class,我可以在其中创建多个伪终端线程,为了与它们中的每一个对话,我必须创建多个文件/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,master和slave是运行,唯一的问题是:
FD_ISSET(self->in, &inFds)
表示没有设置,
谢谢
您应该确保 select()
的第一个参数是所有可能的文件描述符中 最高的 加上一个,因此:
select(std::max(self->masterFd, self->in) + 1, &inFds, &inFds, NULL, NULL)