当前位置: 首页 > 知识库问答 >
问题:

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

闻人鸿文
2023-03-14

我有一个伪终端从机,它给我一个资源暂时不可用的读/写错误(11)。我一直无法解决这个问题,但直到一周前我还不知道任何事情。所以,我可能漏掉了一些明显的东西。

根据我所了解的情况,这可能是由对非阻塞PTY调用read()引起的。但是,当我检查从pty的Iopen()之后的f_getfl时,该值显示它是一个阻塞文件描述符。

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

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

那么,如果slavefd设置为blocking,为什么read()将errno设置为资源暂时不可用呢?f_getfl的标志看起来正确吗?我还可以尝试什么来缩小这个问题的原因?

更新:(更多信息)

if (argc!=2)
    return;

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

问题已解决:

PPPD正在修改我试图读/写的从节点。当pppd控制TTY/PTY设备时,它将行规程从n_tty更改为n_ppp。这意味着当您打开()然后读取()写入()到从节点时,将使用PPP中间驱动程序而不是TTY驱动程序。因此,read()write()归结为一个完全不同的函数。查看n_ppp驱动程序,我发现以下内容。这回答了我的问题,为什么Eazine会被返回。

/*
 * 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个答案

阳凌
2023-03-14

PPPD正在修改我试图读/写的从节点。当pppd控制TTY/PTY设备时,它将行规程从n_tty更改为n_ppp。这意味着当您打开()然后读取()写入()到从节点时,将使用PPP中间驱动程序而不是TTY驱动程序。因此,read()write()归结为一个完全不同的函数。查看n_ppp驱动程序,我发现以下内容。这回答了我的问题,为什么Eazine会被返回。

/*
 * 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;
}
 类似资料:
  • 我在C中使用tcp套接字服务器和客户端。使用AF_INET、SOCK_STREAM和IPPROTO_TCP 在sock send()命令上有一个可能导致“资源暂时不可用”的帖子,其中Davide Berra说 这是因为您使用的是非阻塞套接字,并且输出缓冲区已满。 从send()手册页

  • 创建套接字 使其非阻塞 呼叫连接 按预期返回-1和errno EINPROGRESS 调用select 返回>0,因此已建立连接 再次阻塞套接字 此部件的代码如下: 那还行。但是我有一个循环,在这个循环中我调用了一个函数,该函数检查是否收到了要读取的新数据包:

  • 问题内容: 从串行设备(/ dev / ttyXX)读取多个进程可以使两个进程无法获取所有数据- 数据将以某种方式在它们之间分配。我想编写一个程序,该程序从串行设备读取,创建几个主/从pty对,然后允许从串行设备读取的程序改为从pty读取,以便所有读取过程都接收数据从串行设备中读取数据,让pty像串行设备一样,从它们开始从pty读取数据时,它们只会获得最新数据。换句话说,在开始读取之前,您将不会获

  • 我正在用c语言(使用openwrt作为操作系统)构建一个项目,将文件上载到FTP服务器。我对传入的数据使用MQTT。因此,对于我订阅的每个主题,我都会保存这些数据,然后将其上载到FTP服务器,为了使事情顺利进行,每次需要上载文件时,我都会使用一个线程来完成这项工作。为了确保程序不会运行太多线程,允许每个主题创建一个线程。我使用了一个变量(比如mutex,但它不是pthread\u mutex\t,

  • 以下是错误日志: 这里有一个相关的问题:https://stackoverflow.com/a/14370767,它建议使用SO_SNDTIMEO套接字选项设置发送超时。

  • 这一章,我们来讲讲如何使用python做一个伪终端.不过在这之前你需要先了解一点伪终端的意思,还有一些技巧.这个我们会在下面讲到: 伪终端其实就是命令终端(cmd.exe,/bin/sh)通过网络接口反弹给攻击者,或者是新建一个监听端口反弹一个终端给攻击者,值得注意的就是原终端对于标准的输入,输出是不做处理的(stdin/stdout/stderr),同样的反弹的shell也是不对它做处理的.(s