伪终端(pty)报告资源暂时不可用

时间:2012-08-07 15:29:43

标签: c linux io pty

我有一个伪终端从属设备,它给我一个资源暂时不可用(11)的读/写错误。我一直无法解决这个问题,但直到一个星期前我才知道任何问题。所以,我可能会遗漏一些明显的东西。

根据我的阅读,这可以通过在非阻塞pty上调用read()来引起。但是,当我检查从属F_GETFL后的open()时,该值显示它是一个阻塞文件描述符。

F_GETFL的输出显示O_NONBLOCK标志已禁用,并且O_RDWR标志已启用:

printf("F_GETFL: %x\n", fcntl( slavefd, F_GETFL)); // outputs F_GETFL: 2

我甚至尝试将slavefd视为非阻止文件,方法是使用select()来确定它何时就绪。但是,它每次都会超时。

那么,如果read()设置为阻止,为什么slavefd将errno设置为资源暂时不可用F_GETFL的标志看起来是否正确?还有什么可以尝试缩小这个问题的原因?

更新:(更多信息)

我还不确定,但我认为pty奴隶设备节点被pppd以某种方式锁定。我被告知你可以回应pty奴隶,这似乎是真的,除非pppd使用它。

更新2:(已添加代码)

if (argc!=2)
    return;

printf("opening %s\n", argv[1]);
slavefd = open(argv[1], O_RDWR );
if (slavefd < 0)
    return;

此更新显示了我如何打开从属设备。由于我使用此应用程序进行调试,我只是直接使用argv[1]

问题已解决:

我尝试读取/写入的从属节点正在被pppd修改。当pppd控制tty / pty设备时,它会将行规则N_TTY更改为N_PPP。这意味着当您open()然后read()write()到从属节点时,将使用PPP中间驱动程序而不是TTY驱动程序。因此,read()write()归结为完全不同的功能。看看N_PPP驱动程序,我发现了以下内容。这回答了我为什么要退回EAGAIN的问题。

/*
 * Read does nothing - no data is ever available this way.
 * Pppd reads and writes packets via /dev/ppp instead.
 */
static ssize_t
ppp_asynctty_read(struct tty_struct *tty, struct file *file,
          unsigned char __user *buf, size_t count)
{
    return -EAGAIN;
}

/*
 * Write on the tty does nothing, the packets all come in
 * from the ppp generic stuff.
 */
static ssize_t
        ppp_asynctty_write(struct tty_struct *tty, struct file *file,
           const unsigned char *buf, size_t count)
{
    return -EAGAIN;
}

1 个答案:

答案 0 :(得分:1)

我尝试读取/写入的从属节点正在被pppd修改。当pppd控制tty / pty设备时,它会将行规则N_TTY更改为N_PPP。这意味着当您open()然后read()write()到从属节点时,将使用PPP中间驱动程序而不是TTY驱动程序。因此,read()write()归结为完全不同的功能。看看N_PPP驱动程序,我发现了以下内容。这回答了我为什么要退回EAGAIN的问题。

/*
 * Read does nothing - no data is ever available this way.
 * Pppd reads and writes packets via /dev/ppp instead.
 */
static ssize_t
ppp_asynctty_read(struct tty_struct *tty, struct file *file,
          unsigned char __user *buf, size_t count)
{
    return -EAGAIN;
}

/*
 * Write on the tty does nothing, the packets all come in
 * from the ppp generic stuff.
 */
static ssize_t
        ppp_asynctty_write(struct tty_struct *tty, struct file *file,
           const unsigned char *buf, size_t count)
{
    return -EAGAIN;
}