12
votes

Comment vérifier si STDIN est toujours ouvert sans blocage?

J'ai besoin de mon programme écrit dans Pure C pour arrêter l'exécution lorsque STDIN est fermé.

Il y a un travail indéfini effectué dans le cycle principal du programme et je ne peux aucun moyen d'utiliser des chèques de blocage (comme getc () ) là-bas (aucune donnée n'est censée arriver sur stdin - il reste juste ouvert pour le temps inconnu).

J'ai l'intention d'utiliser la fonctionnalité décrite dans la réalisation du démon de réseau hébergé dans INETD, XINETD ou leurs analogues - il doit émettre des données sur STDOUT pendant que la connexion reste ouverte et terminer correctement le travail lorsqu'il se ferme. Maintenant, mon programme est tué par un service d'hébergement car il ne cessera pas une résiliation de la connexion.

Je me demande si fcntl () avec o_nonblock drapeau appliqué au descripteur STDIN me permettrait d'utiliser lecture () fonction de non-blocage mode? Devrais-je utiliser sélectionner () d'une manière ou d'une autre?

P.s. Les données ne sont pas supposées mais peuvent arriver à Stdin. Un moyen de lecture non bloquante sera une réponse à la question.


0 commentaires

5 Réponses :


0
votes

Qu'est-ce qui ne va pas avec Feof (stdin) ?


2 commentaires

Cela ne fonctionnera pas si vous ne lisez pas toutes les données. Comment puis-je lire toutes les données (corbeille par exemple) sans bloquer les opérations?


EOF peut être injecté dans un stdin ouvert (par exemple via Ctrl-D sous Linux). Cela ne signifie pas que STDIN est fermé.



1
votes

Je ne sais pas si vous pouvez définir O_NONBLOCK sur stdin, mais SELECT () ou Sondage () obtiendra certainement le travail.


1 commentaires

Oui, vous pouvez définir O_NONBLOCK sur STDIN. Si votre STDIN est tiré d'un autre programme, ce programme peut ne pas gérer son descripteur de fichier sortant devenir très bien bloqué.



0
votes

Oui, vous pouvez utiliser Sélectionner (avec un délai d'arrêt zéro). Vous n'avez pas besoin de définir le descripteur de fichier non bloquant, bien que - si SELECT vous indique que le descripteur de fichier est lisible, puis un lisez sur celui-ci ne bloquera certainement pas .

Ainsi, le descripteur de fichier de sondage 0 occisionally avec Sélectionnez , et s'il est lisible, lisez it. Si lisez renvoie 0, alors cela signifie qu'il a été fermé.


0 commentaires

8
votes

SELECT () STRT> Est-ce que vous voulez exactement ce que vous voulez: signalez qu'une opération (lecture, dans ce cas) sur un descripteur de fichier (fichier, socket, autre) ne bloquera pas.

if (is_ready(fileno(stdin))) {
    /* read stuff from stdin will not block */
}


1 commentaires

Sondage est également exactement ce que OP veut, et son interface est un peu plus facile que Sélectionner lors de la gestion d'un petit jeu de descripteurs de fichier fixe.



2
votes

Je me demande si FCTNTL () avec le drapeau O_NONBLOCK appliqué au descripteur STDIN me permettrait d'utiliser la fonction Lecture () en mode non bloquante?

Running STDIN avec O_NONBLOCK présente des avantages sur Sélectionner. Select dit qu'il y a des données, mais pas combien. Il y a des moments que vous souhaitez obtenir toutes les données disponibles, mais pas bloquer, peu importe la quantité de placement dans la file d'attente. Courir Select pour chaque personnage semble avoir beaucoup de travail occupé ... O_NONBLOCK n'a pas fonctionné pour moi. C'est un drapeau interne, non exposé dans la plupart des pilotes TTY.

Découvrez ioctl (..., Fionbio). Il semble faire le travail.


0 commentaires