openpty retornando zero como descritor de arquivo mestre

0

Estou abrindo um pseudo-terminal com a função openpty . Isso será usado para redirecionar alguns dados provenientes de uma porta serial para um aplicativo externo (neste caso, um receptor GPS).

O fato é que às vezes eu estou recebendo um zero para o descritor de arquivo mestre (no código abaixo, parâmetro mpty). Nesses casos, o redirecionamento não funciona e o aplicativo externo não está recebendo nenhum dado, o que eu suponho ser normal, pois zero é o Input Padrão descritor.

O que estou fazendo errado? É possível bloquear o stdin para ser o mestre com a função openpty?

Obrigado antecipadamente.

bool openPts(char* ptsName, int* mpty, int* spty) {

    if (openpty(mpty, spty, ptsName, NULL, NULL) == -1) {
        printf("openPts: ERROR openpty [%d] %s",
            errno, strerror(errno));
        return false;
    }

//  if (*mpty == 0 || *spty == 0) {
//      printf("openPts: ERROR openpty mpty[%d] spty[%d] [%d] %s",
//          *mpty, *spty, errno, strerror(errno));
//
//      if (*mpty > 0) {
//          close(*mpty);
//      }
//      if (*spty > 0) {
//          close(*spty);
//      }
//      return false;
//  }

    ///////////////////////////////////////////////////////////////////
    //Set non-blocking
    if (setNonblock(*mpty) == -1) {
        printf("openPts: mpty[%d] NONBLOCK ERROR [%d] [%s]",
            *mpty, errno, strerror(errno));
    }
    if (setNonblock(*spty) == -1) {
        printf("openPts: spty[%d] NONBLOCK ERROR [%d] [%s]",
            *spty, errno, strerror(errno));
    }
    ///////////////////////////////////////////////////////////////////
    printf("openPts[%s]: fd MASTER[%d] fd SLAVE[%d]",
        ptsName, *mpty, *spty);

    return true;
}
    
por aloplop85 02.02.2016 / 11:06

1 resposta

1

zero é um descritor de arquivo legal. A chamada openpty será (como open ) retorna um inteiro positivo (zero ou mais). Eles retornam -1 no erro.

Uma chamada bem-sucedida retorna um novo descritor de arquivo (anteriormente não utilizado). Você poderia obter este resultado que você tinha fechado stdin (também legal, feito ocasionalmente no daemon / código de serviço).

    
por 24.07.2016 / 20:32