gpt4 book ai didi

c++ - 文件描述符的 Read() 挂起

转载 作者:行者123 更新时间:2023-11-28 03:58:29 25 4
gpt4 key购买 nike

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

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

Ubuntu、QT C++

已编辑:好的,我可以确认除了读取循环之外所有这些东西都有效。在调试器的本地/观察者选项卡中,它显示 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;
}

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

最佳答案

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

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

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

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

* 如果 O_NONBLOCK 是明确的,read() 将阻塞调用线程直到一些数据可用。

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

关于c++ - 文件描述符的 Read() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2186438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com