The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
как определить номер консоли, !*! apels1n, 28-Ноя-04, 16:03  [смотреть все]
В консольной программе на С необходимо определить 2 вещи:
1) под какой консолью запущена эта программа (я так понимаю это просто свойство процесса)
2) какая консоль в данный момент активна, т.е в какой пользователь работает. Рассматриваются только консоли, запущенные на родной машине и переключающиеся по alt-fx.
Результат необходим такой: в каждой консоли работает одинаковая программа, от устройства приходит прерывание или каждая из программ по очереди опрашивает устройство, но результат этого прерывания происходит только на активной консоли. Очень прошу совета в реализации..
  • как определить номер консоли, !*! apels1n, 09:39 , 29-Ноя-04 (1)
    >2) какая консоль в данный момент активна, т.е в какой пользователь работает.

    #include <linux/vt.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/ioctl.h>

    int main ()
    {
        int tty_file_descriptor;
        struct vt_stat terminal_status;

        printf ("Hi. This program retrieves a bit of console information and prints it to the screen.\n");
        tty_file_descriptor = open("/dev/tty0", O_RDWR);
        if (tty_file_descriptor == -1) {
            printf ("I couldn't open /dev/tty0 for you. I will terminate now.\n");
        }
        if (ioctl (tty_file_descriptor, VT_GETSTATE, &terminal_status) == -1) {
            printf ("An error occured while executing the ioctl. No information was supplied.\n");
            exit(1);
        }
        printf ("The currently active virtual terminal is /dev/tty%i\n",terminal_status.v_active);
        return 0;
    }

    мож кому понадобится.. ищу решение первого вопроса...

  • как определить номер консоли, !*! Alexander S. Salieff, 12:10 , 29-Ноя-04 (2)
    >В консольной программе на С необходимо определить 2 вещи:
    >1) под какой консолью запущена эта программа (я так понимаю это просто
    >свойство процесса)

    Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /proc/<PID>/fd/0, /proc/<PID>/fd/1, /proc/<PID>/fd/2. Возможно это делается более изящно через termcap/termios/etc, но как точно, хз...

    • как определить номер консоли, !*! Apels1n, 12:47 , 08-Дек-04 (4)
      >Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /proc/<PID>/fd/0, /proc/<PID>/fd/1, /proc/<PID>/fd/2.

      А не подскажите, как бы мне это программно сделать? И возможно ли по ссылке программно определить путь к файлу?

      Еще отыскал вот такой вариант:

      I've found a solution, but it doesn't feel very elegant to me.  The
      /proc/<pid>/stat files give the tty number for each process (e.g.
      34817). I then go through the /dev/pts directory and stat() each file
      there.  I then compare one of the struct stat members (st_rdev) returned
      by stat() to the tty number found in /proc/<pid>/stat.  If they match,
      then the file stated (e.g. /dev/pts/1) is the terminal that that process
      is attached to.

      • как определить номер консоли, !*! Alexander S. Salieff, 15:02 , 08-Дек-04 (5)
        >>Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /proc/<PID>/fd/0, /proc/<PID>/fd/1, /proc/<PID>/fd/2.
        >
        >А не подскажите, как бы мне это программно сделать? И возможно ли
        >по ссылке программно определить путь к файлу?

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

        int main(int argc, char ** argv)
        {
        if (argc<2)
          {
          fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
          return 1;
          }

        char sim_link_name[1000]={0};
        char tty_name0[1000]={0};
        char tty_name1[1000]={0};
        char tty_name2[1000]={0};
        int len=-1;

        snprintf(sim_link_name, 900, "/proc/%s/fd/0", argv[1]);
        len = readlink(sim_link_name, tty_name0, 900);
        if (len<0)
          {
          perror("readlink(0) : ");
          return 1;
          }
        tty_name0[len]='\0';

        snprintf(sim_link_name, 900, "/proc/%s/fd/1", argv[1]);
        len = readlink(sim_link_name, tty_name1, 900);
        if (len<0)
          {
          perror("readlink(1) : ");
          return 1;
          }
        tty_name1[len]='\0';

        snprintf(sim_link_name, 900, "/proc/%s/fd/2", argv[1]);
        len = readlink(sim_link_name, tty_name2, 900);
        if (len<0)
          {
          perror("readlink(2) : ");
          return 1;
          }
        tty_name2[len]='\0';

        printf("Process PID = %s\nProcess TTY0 = %s\nProcess TTY1 = %s\nProcess TTY2 = %s\n", argv[1], tty_name0, tty_name1, tty_name2);
        return 0;
        }

        Естесственно этот вариант требует взаимодействия со стороны программы, чей TTY определяется, т.к. она может запросто перенаправить свои stdin/stdout/stderr, отстрелиться от консоли, или сделать другую гадость ;)
        Надеюсь, как внутри программы взять свой пид вместо argv[1] объяснять не надо? ;)

        • как определить номер консоли, !*! Apels1n, 15:17 , 08-Дек-04 (6)
          >Естесственно этот вариант требует взаимодействия со стороны программы, чей TTY определяется, т.к.
          >она может запросто перенаправить свои stdin/stdout/stderr, отстрелиться от консоли, или сделать
          >другую гадость ;)
          >Надеюсь, как внутри программы взять свой пид вместо argv[1] объяснять не надо?
          >;)

          нет не надо:) спасибо огромное




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру