2009-10-03 10 views

Répondre

3

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.

0

Vous avez besoin d'un numéro de descripteur de fichier attaché au terminal actuel. Par exemple, vous pouvez utiliser 0 ou STDIN_FILENO de unistd.h.

5

Souvent, l'entrée, la sortie et/ou l'erreur standard (0, 1 ou 2) seront connectées au terminal de contrôle. Pour être sûr, il suffit d'ouvrir/dev/tty, qui sera toujours le terminal de contrôle si vous en avez un. Le descripteur de fichier renvoyé par open() peut être passé à tcgetpgrp(), puis fermé s'il n'est plus nécessaire.

La fonction tcgetpgrp() renvoie l'ID de groupe de processus de premier plan, tandis que getpgrp() renvoie l'ID de groupe de processus. Ils seraient les mêmes si votre processus est au premier plan, ou différent si votre processus est en arrière-plan. tcgetpgrp() retournera une erreur si votre processus n'a pas de terminal de contrôle, et n'est donc pas au premier plan ou en arrière-plan.

Questions connexes