The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"как определить номер консоли"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"как определить номер консоли"
Сообщение от apels1n emailИскать по авторуВ закладки(??) on 28-Ноя-04, 16:03  (MSK)
В консольной программе на С необходимо определить 2 вещи:
1) под какой консолью запущена эта программа (я так понимаю это просто свойство процесса)
2) какая консоль в данный момент активна, т.е в какой пользователь работает. Рассматриваются только консоли, запущенные на родной машине и переключающиеся по alt-fx.
Результат необходим такой: в каждой консоли работает одинаковая программа, от устройства приходит прерывание или каждая из программ по очереди опрашивает устройство, но результат этого прерывания происходит только на активной консоли. Очень прошу совета в реализации..
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "как определить номер консоли"
Сообщение от apels1n emailИскать по авторуВ закладки(??) on 29-Ноя-04, 09:39  (MSK)
>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;
}

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "как определить номер консоли"
Сообщение от Xela emailИскать по авторуВ закладки(ok) on 30-Ноя-04, 16:42  (MSK)
>мож кому понадобится.. ищу решение первого вопроса...

/dev/console

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "как определить номер консоли"
Сообщение от Apels1n emailИскать по авторуВ закладки(??) on 08-Дек-04, 12:47  (MSK)
>Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /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.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "как определить номер консоли"
Сообщение от Alexander S. Salieff emailИскать по авторуВ закладки on 08-Дек-04, 15:02  (MSK)
>>Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /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] объяснять не надо? ;)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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