0

嘿,希望这应该是我最后一个与 PTY 相关的问题,我可以继续讨论更令人兴奋的问题。(C;

这是我为创建和读取/写入 pty 而编写的一组小函数:http: //pastebin.com/m4fcee34d 唯一的问题是它们不起作用!在我运行初始化程序和 writeToPty("ls -l") 后, readFromPty 的“输出”仍然为空。

Ubuntu,QT C++

编辑:好的,我可以确认所有这些东西都有效,除了读取循环。在调试器的 locals/watchers 选项卡中,它显示 QString“输出”实际上确实得到了正确的数据,但是在它( read() )用完输出中的字符之后它运行然后挂起。发生了什么事,我该如何解决?谢谢!(C:

#include <iostream>
#include <unistd.h>
#include <utmp.h>
#include <pty.h>

#include <QString>
#include <QThread>
// You also need libutil in your .pro file for this to compile.

class CMkPty
{
public:
    CMkPty( int *writeChannel, int *readChannel );
    ~CMkPty();
    int runInPty( char *command );
    int writeToPty( char *input );
    int readFromPty( QString output );
    int m_nPid;

private:
    int m_nMaster, m_nSlave, m_nPosition, m_nBytes;
    char *m_chName;
    void safe_print( char *s );
    char m_output;

};

CMkPty::CMkPty( int *masterFD, int *slaveFD )
{
    openpty( &m_nMaster, &m_nSlave, (char*)0, __null, __null );
    m_nPid = fork();
    *masterFD = m_nMaster;
    *slaveFD = m_nSlave;
    if( m_nPid == 0 )
    {
        login_tty( m_nSlave );
        execl( "/bin/bash", "-l", (char*)0 );
        return;
    }
    else if( m_nPid > 0 )
    {
        return;
    }
    else if( m_nPid < 0 )
    {
        std::cout << "Failed to fork." ;
        return;
    }
}
CMkPty::~CMkPty()
{
    close( m_nMaster );
    close( m_nSlave );
}
int CMkPty::writeToPty( char *szInput )
{
    int nWriteTest;
    write( m_nMaster, szInput, sizeof( szInput ) );
    nWriteTest = write( m_nMaster, "\n", 1 );
    if( nWriteTest < 0 )
    {
        std::cout << "Write to PTY failed" ;
        return -1;
    }
    return 0;
}
int CMkPty::readFromPty( QString output )
{
        char buffer[ 160 ];
        m_nBytes = sizeof( buffer );
        while ( ( m_nPosition = read( m_nMaster, buffer, m_nBytes ) ) > 0 )
        {
            buffer[ m_nPosition ] = 0;
            output += buffer;
        }
       return 0;
}

编辑:是问题的链接,其中包含最终对我有用的代码。

4

1 回答 1

2

我注意到完全熟悉 posix,但是在阅读了这个页面http://pwet.fr/man/linux/fonctions_bibliotheques/posix/read之后,我有了一些见解。更重要的是,如果您在循环的第一遍中没有像预期的那样阅读,我看不到您调整您的 M_nBytes 值。

编辑:从那个链接,也许这会有所帮助:

如果某个进程打开了管道进行写入并且 O_NONBLOCK 已清除,则 read() 将阻塞调用线程,直到写入一些数据或管道被打开管道进行写入的所有进程关闭。

尝试读取支持非阻塞读取且当前没有可用数据的文件(管道或 FIFO 除外)时:

* 如果 O_NONBLOCK 被清除,read() 将阻塞调用线程,直到某些数据可用。

所以本质上,如果你没有处于错误状态,并且你告诉它继续阅读,它会阻塞直到它找到要阅读的东西。

于 2010-02-07T01:51:10.097 回答