[英]PseudoTerminal - Not read from stdin
我正在創建一個類,可以在其中創建多個偽終端線程,以便與它們中的每個對話,我必須創建多個文件/ 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)
這表示未設置
謝謝
您應該確保select()
的第一個參數是所有可能的文件描述符中的最高值加上一個,因此:
select(std::max(self->masterFd, self->in) + 1, &inFds, &inFds, NULL, NULL)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.