LINUX.ORG.RU

Определение ввода с клавиатуры в ядре


0

0

Как определить, что производится ввод с клавиатуры? Точнее, как определить, stdin связан с вводом с клавиатуры либо перенаправлен? По сути, с помощью struct file *f = fget(0); в f->f_dentry->d_inode->i_cdev->dev будут содержаться major и minor устройства, с которого происходит ввод. По логике вещей major должен быть равен 4, но не всегда это получается.


#include <stdio.h>
#include <unistd.h>

int main(void)
{
        char s[100];

        fgets(s, 100, stdin);
        if (isatty(STDIN_FILENO))
                printf("Got \"%s\" from keyboard\n", s);
        else
                printf("Got \"%s\" by redirection", s);

        return 0;
}

bbk123 ★★★★★
()
Ответ на: комментарий от xdiman

по логике вещей, isatty просто дёргает fstat() и анализирует поле st_rdev.

MKuznetsov ★★★★★
()
Ответ на: комментарий от xdiman

В FreeBSD 6.1:

int
isatty(fd)
        int fd;
{
        int retval;
        struct termios t;

        retval = (tcgetattr(fd, &t) != -1);
        return(retval);
}


В glibc 2.4 есть несколько вариантов isatty(). Использование того или
иного варианта зависит от системы. Практически идентичнай
вышеприведённой реализация находится в sysdeps/posix/isatty.c


/* Return 1 if FD is a terminal, 0 if not.  */
int
__isatty (fd)
     int fd;
{
  struct termios term;

  return __tcgetattr (fd, &term) == 0;
}

weak_alias (__isatty, isatty)

Вобще isatty() появилась ещё в 7-й версии AT&T UNIX.

bbk123 ★★★★★
()

Всё, я нашел решение для определения ввода с клавиатуры в ядре. В структуре struct file имеется private_data, и рядом поставлен комментарий - needed for tty driver.

Вообщем работает:

struct file *file;

file = fget(0);

if(file->private_data) printk("keyboard input\n");

else printk("redirected\n");

xdiman
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.