C ++ - Как определить, что я работаю без терминала - PullRequest
0 голосов
/ 06 января 2012

В C / C ++ как мои программы могут определить, есть ли рабочий стол (системный или удаленный) или нет?

В моем проекте три отдельные программы, запущенные (сейчас) в отдельных терминалах gnome.Он запускается последней строкой .profile, поэтому он запускается независимо от того, нахожусь ли я на рабочем столе системы (gnome) или удаленно подключаюсь через VPN / telnet или VPN / remote-desktop.Моя машина находится на расстоянии 250 миль от тестового сайта, поэтому я часто подключаюсь удаленно, чтобы внести изменения и перезапустить программу.

Я бы хотел, чтобы моя программа могла определять, что она запускается с рабочего стола.окружение или из сеанса телнет.Желательно, чтобы они продолжали работать после разрыва удаленного соединения.

Очевидно, мне нужно превратить мои программы в демоны, чтобы они сохранялись после закрытия соединения.Но если я запускаю их в терминале в среде рабочего стола, где на самом деле у меня может быть открыто три терминала, я бы хотел посмотреть их сообщения о прогрессе.И если я отключу удаленный рабочий стол, я бы хотел, чтобы демоны обнаружили это и отключили печать (до уже убитых терминов), но продолжали работать в обычном (бесшумном) режиме демона.Более того, программы могут время от времени перепроверять рабочий стол и возобновлять печать, открывая новые терминалы.

Возможно ли это?Любые предложения по кодированию?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 января 2012

Вы можете использовать функцию isatty. Определить, является ли stdin терминалом или каналом?

#include <stdio.h>
#include <io.h>

//...

if (isatty(fileno(stdin)))
    printf( "stdin is a terminaln" );
else
    printf( "stdin is a file or a pipen");

Дополнительную информацию можно найти по адресу http://www.chemie.fu -berlin.de / chemnet / use / info / libc / libc_12.html

Еще немного кода: http://pastebin.com/S3Lr9tik

0 голосов
/ 06 января 2012

Традиционное решение этой проблемы - опция в командной строке.Такие программы, как правило, демонизируют себя, если им не предоставлена ​​специальная опция отладки, говорящая им об этом.

Другим решением будет использование сценария оболочки для запуска программы как демона с помощью команды nohup (и перенаправления стандартаввод и вывод в /dev/null).

Что касается определения, является ли управляющий терминал локальным или нет, это может быть затруднительно;и X, и Telnet используют виртуальные терминалы, поэтому, если вы работаете в X, вы не сможете различить сеанс Telnet и локальное окно xterm.Тем не менее, возможно, стоит попробовать ... В Linux /proc/<procid>/fd/0 - это символическая ссылка на устройство, подключенное к стандарту в (fd 0): используя что-то вроде readlink, вы сможете определить фактическое имя.Или fstat даст вам старшие и младшие номера устройства.Учитывая это, вы могли бы быть в состоянии определить, что есть что.Если ваш локальный терминал не находится под X, но является реальным терминалом, он определенно будет иметь младший номер, отличный от псевдотерминала.Для xterms возможно, что младшие номера псевдотерминалов попадают в разные диапазоны, или даже что существуют различные наборы псевдотерминалов для удаленных каналов и для X;вам, вероятно, придется поэкспериментировать, и может не быть рабочего решения.(Для начала, на tty на каждом терминале, и посмотрите, что там написано. У меня нет локального доступа к машине Linux, чтобы проверить, но я, кажется, помню, что в Solaris терминалы X имели имена вроде /dev/ttyxx;мои удаленные терминалы в Linux здесь /dev/pts/xx. (где xx - число в каждом случае.)

...