openpty 返回零作为主文件描述符

openpty 返回零作为主文件描述符

我正在打开一个伪终端开放式功能。这将用于将来自串行端口的一些数据重定向到外部应用程序(在本例中为 GPS 接收器)。

事实是,有时我会得到一个amaster 文件描述符为零(在下面的代码中,空参数)。在这些情况下,重定向不起作用,并且外部应用程序没有接收任何数据,我认为这是正常的,因为零是标准输入描述符。

我做错了什么?是否可以用openpty函数阻止stdin成为master?

提前致谢。

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;
}

答案1

零是合法的文件描述符。这openpty打电话会(比如open)返回一个正整数(零或更大)。他们-1出错时返回。

成功的调用返回一个新的(以前未使用的)文件描述符。你可以得到这个你已经关闭的结果stdin(也是合法的,偶尔在守护进程/服务代码中完成)。

相关内容