- как определить номер консоли, 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] объяснять не надо? >;) нет не надо:) спасибо огромное
|