안녕하세요, 이것이 내 마지막 PTY 관련 질문이어야하며 더 흥미 진진한 문제로 이동할 수 있습니다. (c;파일 설명자에서 Read()가 응답하지 않습니다.
다음은 pty를 만들고 읽고 쓰는 데 쓰는 작은 함수 집합입니다. http://pastebin.com/m4fcee34d 유일한 문제는 작동하지 않는다는 것입니다! 이니셜 라이저와 writeToPty ("ls -l ")는, readFromPty에서 '출력'여전히 비어
우분투, QT C++
편집 :.. 좋아,이 모든 물건 읽기 루프를 제외하고 작동하는 디버거 '지역 주민/전문가 탭에서 확인할 수 있습니다 그것은 QString 'output'이 실제로 올바른 데이터를 가져온다는 것을 보여 주지만, 출력 (read()) 후에는 출력에서 문자가 없어져서 실행됩니다. 무슨 일이 일어나고 어떻게 해결할 수 있습니까? 보다 ks! (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 '결국 나를 위해 일한 코드를 사용하여 질문에 대한 사 링크 난