我试图在表示PTY的文件描述符上设置读取超时。我在termios中设置了VMIN = 0和VTIME = 10,我希望在字符可用时返回,如果没有字符可用,则返回一秒钟。但是,我的程序永远处于读取调用中。
关于PTY有什么特别的东西让它不起作用吗?是否有其他TERMIOS设置导致此功能?我在stdin文件描述符上尝试了相同的配置,它按预期工作。
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>
#define debug(...) fprintf (stderr, __VA_ARGS__)
static void set_term (int fd)
{
struct termios termios;
int res;
res = tcgetattr (fd, &termios);
if (res) {
debug ("TERM get error\n");
return;
}
cfmakeraw (&termios);
termios.c_lflag &= ~(ICANON);
termios.c_cc[VMIN] = 0;
termios.c_cc[VTIME] = 10; /* One second */
res = tcsetattr (fd, TCSANOW, &termios);
if (res) {
debug ("TERM set error\n");
return;
}
}
int get_term (void)
{
int fd;
int res;
char *name;
fd = posix_openpt (O_RDWR);
if (fd < 0) {
debug ("Error opening PTY\n");
exit (1);
}
res = grantpt (fd);
if (res) {
debug ("Error granting PTY\n");
exit (1);
}
res = unlockpt (fd);
if (res) {
debug ("Error unlocking PTY\n");
exit (1);
}
name = ptsname (fd);
debug ("Attach terminal on %s\n", name);
return fd;
}
int main (int argc, char **argv)
{
int read_fd;
int bytes;
char c;
read_fd = get_term ();
set_term (read_fd);
bytes = read (read_fd, &c, 1);
debug ("Read returned\n");
return 0;
}
答案 0 :(得分:0)
来自linux pty
(7)联机帮助页(斜体是我的):
伪终端(有时缩写为“pty”)是一对虚拟角色设备 提供双向通信渠道。通道的一端称为 主;另一端被称为奴隶。 伪终端的从端提供 一个行为与古典终端完全相同的界面
但是,您的程序正在从主中读取,但不能指望它与终端设备完全相同
如果你改变/展开get_term
的最后几行......
int slave_fd = open (name, O_RDWR); /* now open the slave end..*/
if (slave_fd < 0) {
debug ("Error opening slave PTY\n");
exit (1);
}
return slave_fd; /* ... and use it instead of the master..*/
...您的示例程序将按预期工作。