Функция для получения терминального файлового дескриптора текущего процесса UNIX - PullRequest
2 голосов
/ 03 октября 2009

Я хочу использовать функцию:

pid_t tcgetpgrp(int fildes);

Как получить файл (для передачи этой функции).

И идентификатор группы процессов, возвращаемый этой функцией, совпадает с идентификатором, возвращаемым

getpgrp(0)//0 for the calling process

??

Ответы [ 3 ]

5 голосов
/ 04 октября 2009

Часто стандартный вход, выход и / или ошибка (0, 1 или 2) будут подключены к управляющему терминалу. Чтобы быть уверенным, просто откройте / dev / tty, который всегда будет управляющим терминалом, если он у вас есть. Дескриптор файла, возвращенный из open (), может быть передан в tcgetpgrp () и затем закрыт, если он больше не нужен.

Функция tcgetpgrp () возвращает идентификатор группы процессов переднего плана, тогда как getpgrp () возвращает идентификатор группы процессов. Они будут одинаковыми, если ваш процесс находится на переднем плане, или другими, если ваш процесс находится в фоновом режиме. tcgetpgrp () вернет ошибку, если у вашего процесса нет управляющего терминала, и поэтому он не находится на переднем плане или фоне.

3 голосов
/ 03 октября 2009

Вы можете передать любой файловый дескриптор, открытый для терминала; вызов вызовет информацию об этом терминале. Процесс может иметь файловые дескрипторы, открытые для нескольких терминалов, но не более одного из них является управляющим терминалом процесса. Фактически, данный терминал может не иметь связанной с ним группы процессов, для которой он является управляющим терминалом (хотя в этом случае он относительно маловероятно).

Michiel Buddingh 'предложил STDIN_FILENO из <unistd.h> (что обычно является необычным способом написания 0); проблема в том, что программы могут иметь стандартный ввод, перенаправленный из файла, или иметь ввод по каналу, в этом случае стандартный ввод не является терминалом. Аналогичные соображения применимы к STDOUT_FILENO (он же 1). Поэтому лучшим дескриптором, который нужно использовать, часто является STDERR_FILENO (он же 2); это наименьшая вероятность перенаправления.

Вторая половина вопроса «возвращает tcgetpgrp() то же значение, что и getpgrp()». Ответ - нет'. Каждый процесс принадлежит группе процессов, и getpgrp() будет надежно идентифицировать эту группу. Не у каждого процесса есть управляющий терминал, и не каждый файловый дескриптор идентифицирует терминал, поэтому tcgetpgrp() может вернуть ошибку ENOTTY. Кроме того, когда tcgetpgrp() возвращает значение, это значение текущей группы процессов переднего плана, связанной с терминалом, которое явно не обязательно совпадает с группой процессов текущего процесса, которая может быть частью фонового процесса. группа, связанная с терминалом. Текущая группа процессов переднего плана также может изменяться со временем.

0 голосов
/ 03 октября 2009

Вам нужен номер дескриптора файла, прикрепленный к текущему терминалу. Например, вы можете использовать 0 или STDIN_FILENO из unistd.h.

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