Vous pouvez transmettre n'importe quel descripteur de fichier ouvert à un terminal; l'appel récupérera les informations sur ce terminal. Un processus peut avoir des descripteurs de fichiers ouverts à un certain nombre de terminaux, mais au plus un d'entre eux est le terminal de contrôle du processus. Un terminal donné peut, en fait, ne pas être associé à un groupe de processus pour lequel il est le terminal de contrôle (bien qu'il soit relativement peu probable qu'il soit ouvert dans ce cas).
Michiel Buddingh 'a suggéré STDIN_FILENO
de <unistd.h>
(ce qui est normalement une façon élégante d'écrire 0); le problème avec cela est que les programmes peuvent avoir une entrée standard redirigée à partir d'un fichier ou avoir l'entrée d'un tuyau, auquel cas l'entrée standard n'est pas un terminal. Des considérations similaires s'appliquent à STDOUT_FILENO
(alias 1). Le meilleur descripteur à utiliser est donc souvent STDERR_FILENO
(alias 2); c'est le moins susceptible d'être redirigé.
La seconde moitié de la question est «est-ce que tcgetpgrp()
renvoie la même valeur que getpgrp()
». La réponse est non'. Chaque processus appartient à un groupe de processus et getpgrp()
identifiera ce groupe de façon fiable. Tous les processus n'ont pas de terminal de contrôle, et chaque descripteur de fichier n'identifie pas un terminal. tcgetpgrp()
peut renvoyer l'erreur ENOTTY. En outre, lorsque tcgetpgrp()
renvoie une valeur, c'est la valeur du groupe de processus premier plan actuel associé au terminal, qui n'est pas nécessairement identique au groupe de processus du processus en cours, qui peut faire partie d'un groupe de processus d'arrière-plan associé avec le terminal. Le groupe de processus de premier plan actuel peut également évoluer avec le temps.