ПсевдоТерминал — не читается со стандартного ввода

Я создаю класс, в котором я могу создать несколько потоков, которые являются псевдо-терминалами, для того, чтобы общаться с каждым из них, мне нужно создать несколько файлов / файлов, чтобы общаться с каждым ведомым устройством псевдотерминала, потому что выполнение задач на 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)

Что означает, что он не установлен,

Спасибо

0

Решение

Вы должны убедиться, что первый аргумент select() это наибольший из всех возможных файловых дескрипторов плюс один, так что:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]