2010-02-02 6 views
0

안녕하세요, 이것이 내 마지막 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 '결국 나를 위해 일한 코드를 사용하여 질문에 대한 사 링크 난

답변

2

는 POSIX와 완전히 잘 알고 있습니다 만,이 페이지 http://pwet.fr/man/linux/fonctions_bibliotheques/posix/read를 읽은 후 나는 몇 가지가 있었다 통찰력. 무엇보다, 루프의 첫 번째 패스에서 예상했던만큼 많이 읽지 않았다면 M_nBytes 값을 조정할 수 없습니다.

편집 : 해당 링크에서 아마도 도움 :

어떤 프로세스가 파이프를 쓰기 위해 열었고 O_NONBLOCK이 해제되어 있으면, read()는 파이프에 쓰기를 위해 열려있는 모든 프로세스에 의해 데이터가 기록되거나 파이프가 닫힐 때까지 호출 스레드를 차단합니다.

비 차단 읽기 지원하며, 현재 사용 가능한 데이터가 없습니다 (파이프 나 FIFO) 이외의 다른 파일을 읽으려고 할 때 : 호출 스레드를 차단하여야한다) O_NONBLOCK이 깨끗하면

* (읽기 일부 데이터를 사용할 수있게 될 때까지

본질적으로 오류 상태가 아니라고 계속 읽으려는 경우 읽는 것이 발견 될 때까지 차단됩니다.

관련 문제