Как выяснить, контролирует ли Linux TTY группу процессов - PullRequest
5 голосов
/ 07 июля 2010

Итак, у меня есть tty (скажем, / dev / tty5), и я хочу знать, является ли он в настоящий момент управляющим tty для группы процессов или сеанса, или он в данный момент не известен. POSIX имеет две функции API, которые предлагают себя здесь: tcgetpgrp () и tcgetsid (), обе из которых работают, однако, только если вызывающий имеет tty как контролирующий tty - что в этом случае делает их в основном бесполезными (и на самом деле я не вообще не вижу смысла в tcgetsid ().

У кого-нибудь есть предложение, как я могу в здравом уме определить из C, является ли терминал в настоящее время управляющим терминалом процесса? Я забочусь только о Linux, поэтому, если нужны специфичные для Linux API, это нормально для меня.

Ответы [ 4 ]

1 голос
/ 07 июля 2010

BSD: int ioctl (int tty, TIOCGETPGRP, int * foreground_group);

Linux: int tcgetpgrp (int tty, int * foreground_group);

Linux работает, только если у вас есть права доступа к не принадлежащему терминалу, т. Е. Вы являетесь пользователем root.Это преднамеренная реализация безопасности.BSD ioctl () позволяет любому tty взять любую группу процессов (или даже несуществующие группы процессов) в качестве переднего плана tty.POSIX разрешает доступ только к группам процессов, которые имеют tty в качестве контролирующего tty.Это ограничение запрещает некоторые двусмысленные и подрывающие безопасность случаи, присутствующие в BSD ioctl.

Что вы пытаетесь сделать?Вы должны беспокоиться только об управлении процессами tty, если вы ядро, передающее сигналы.

Редактировать: я забыл / proc
С www.die.net: / proc / [number] / fd Этоподкаталог, содержащий одну запись для каждого файла, который процесс открыл, названный его дескриптором файла, и который является символической ссылкой на фактический файл.Таким образом, 0 - это стандартный ввод, 1 стандартный вывод, 2 стандартные ошибки и т. Д.

0 голосов
/ 28 июля 2010

вы можете использовать файловую систему proc для запроса контрольного tty процесса, если вам известен PID процесса.

/ proc // fd / 0 является символической ссылкой на tty (скажем, / dev / pts / 4).

Таким образом, все, что вам нужно сделать, это создать путь proc с PID (например, / proc / 7834 / fd / 0, где 7834 - PID), а затем вызвать системный вызов readlink, чтобы получить tty

См. Фрагмент кода C ниже

sprintf(procPath, "/proc/%s/fd/0", pid);
int ret = readlink(procPath, buffer, MAX_LEN);
buffer[ret] = '\0';
0 голосов
/ 12 июля 2010

Не уверен, что это точно отвечает вашим потребностям, в любом случае вот оно:

#include <stdlib.h>
#include <stdio.h>

int main()
{
  int status = system("fuser /dev/tty1 >/dev/null 2>/dev/null") >> 8;
  printf("%s",
         status ?
           "tty not in use as a text terminal.\n" :
           "tty in use as a text terminal.\n");
  return 0;
}
0 голосов
/ 08 июля 2010

Выполните это как системный вызов "ps au> tempfile.txt" и проанализируйте файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...