В консольной программе на С необходимо определить 2 вещи:
1) под какой консолью запущена эта программа (я так понимаю это просто свойство процесса)
2) какая консоль в данный момент активна, т.е в какой пользователь работает. Рассматриваются только консоли, запущенные на родной машине и переключающиеся по alt-fx.
Результат необходим такой: в каждой консоли работает одинаковая программа, от устройства приходит прерывание или каждая из программ по очереди опрашивает устройство, но результат этого прерывания происходит только на активной консоли. Очень прошу совета в реализации..
>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;
}мож кому понадобится.. ищу решение первого вопроса...
>мож кому понадобится.. ищу решение первого вопроса.../dev/console
>В консольной программе на С необходимо определить 2 вещи:
>1) под какой консолью запущена эта программа (я так понимаю это просто
>свойство процесса)Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /proc/<PID>/fd/0, /proc/<PID>/fd/1, /proc/<PID>/fd/2. Возможно это делается более изящно через termcap/termios/etc, но как точно, хз...
>Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /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.
>>Самое простое решение, которое напрашивается, посмотреть, куда указывают симлинки /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] объяснять не надо? ;)
>Естесственно этот вариант требует взаимодействия со стороны программы, чей TTY определяется, т.к.
>она может запросто перенаправить свои stdin/stdout/stderr, отстрелиться от консоли, или сделать
>другую гадость ;)
>Надеюсь, как внутри программы взять свой пид вместо argv[1] объяснять не надо?
>;)нет не надо:) спасибо огромное