我正在试图为代表 PTY 的文件描述符设定一个读过超时值。 我将 VMIN = 0 和 VTIME = 10 的名词设置为名词 。 我期望当字符可用时返回, 或者在一秒钟后, 如果没有字符可用时返回 。 但是, 我的程序会永远在读取调用中 。
PTY有什么特别之处使这个无效吗?有没有其他的 TERTIOS 设置使这个功能起作用?我在标准文件描述符上尝试过同样的配置,它和预期的一样有效。
#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
");
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
");
return;
}
}
int get_term (void)
{
int fd;
int res;
char *name;
fd = posix_openpt (O_RDWR);
if (fd < 0) {
debug ("Error opening PTY
");
exit (1);
}
res = grantpt (fd);
if (res) {
debug ("Error granting PTY
");
exit (1);
}
res = unlockpt (fd);
if (res) {
debug ("Error unlocking PTY
");
exit (1);
}
name = ptsname (fd);
debug ("Attach terminal on %s
", 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
");
return 0;
}