2009-09-21 7 views
4

En C, quel est le moyen de détecter un programme appelé en "mode d'arrière-plan"? J'ai un programme que je voudrais lancer de manière interactive ou en arrière-plan.Détection de l'opération d'arrière-plan

Comment puis-je détecter que je ne devrais pas lire stdin et terminer dans un état "Stopped: tty input"?

Devrais-je tester que stdin est fermé? Comment puis je faire ça ?

Editer: isatty semble être une bonne idée, mais que se passe-t-il si stdin est une extrémité de pipe, et non un tty?

Répondre

3

Utilisez la fonction tcgetpgrp() sur le descripteur de fichier du terminal de contrôle (par exemple STDIN_FILENO ou 0 pour stdin) pour vérifier si le groupe de processus de premier plan actuel est égal à votre propre groupe de processus (de getpgrp()). Cependant, le groupe de processus de premier plan peut changer à tout moment, car votre programme est déplacé entre le premier plan et l'arrière-plan. Par exemple, il peut changer immédiatement après avoir appelé tcgetpgrp() et avant de le tester. Alors gardez cela à l'esprit si vous allez prendre des mesures basées sur cela; ce n'est pas une méthode fiable d'éviter SIGTTIN.

#include <unistd.h> 
pid_t fg = tcgetpgrp(STDIN_FILENO); 
if (fg == -1) { 
    /* stdin is not controlling terminal (e.g. file, pipe, etc.) */ 
} else if (fg == getpgrp()) { 
    /* foreground */ 
} else { 
    /* background */ 
} 
1

1) Vous devriez vérifier si stdin est ouvert, et ouvrir/dev/null s'il se ferme.

2) Il est possible d'utiliser isatty qui « renvoie 1 si desc est un descripteur de fichier ouvert connecté à une borne et 0 sinon »