Вы можете передать любой файловый дескриптор, открытый для терминала; вызов вызовет информацию об этом терминале. Процесс может иметь файловые дескрипторы, открытые для нескольких терминалов, но не более одного из них является управляющим терминалом процесса. Фактически, данный терминал может не иметь связанной с ним группы процессов, для которой он является управляющим терминалом (хотя в этом случае он относительно маловероятно).
Michiel Buddingh 'предложил STDIN_FILENO
из <unistd.h>
(что обычно является необычным способом написания 0); проблема в том, что программы могут иметь стандартный ввод, перенаправленный из файла, или иметь ввод по каналу, в этом случае стандартный ввод не является терминалом. Аналогичные соображения применимы к STDOUT_FILENO
(он же 1). Поэтому лучшим дескриптором, который нужно использовать, часто является STDERR_FILENO
(он же 2); это наименьшая вероятность перенаправления.
Вторая половина вопроса «возвращает tcgetpgrp()
то же значение, что и getpgrp()
». Ответ - нет'. Каждый процесс принадлежит группе процессов, и getpgrp()
будет надежно идентифицировать эту группу. Не у каждого процесса есть управляющий терминал, и не каждый файловый дескриптор идентифицирует терминал, поэтому tcgetpgrp()
может вернуть ошибку ENOTTY. Кроме того, когда tcgetpgrp()
возвращает значение, это значение текущей группы процессов переднего плана, связанной с терминалом, которое явно не обязательно совпадает с группой процессов текущего процесса, которая может быть частью фонового процесса. группа, связанная с терминалом. Текущая группа процессов переднего плана также может изменяться со временем.