簡體   English   中英

偽終端-不從stdin中讀取

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM