我有一个伪终端从属设备,它给我一个资源暂时不可用(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;
}
答案 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;
}