J'ai besoin de mon programme écrit dans Pure C pour arrêter l'exécution lorsque STDIN est fermé. P>
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 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. P>
Je me demande si 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. P> getc () code>) là-bas (aucune donnée n'est censée arriver sur stdin - il reste juste ouvert pour le temps inconnu). p>
fcntl () code> avec
o_nonblock code> drapeau appliqué au descripteur STDIN me permettrait d'utiliser
lecture () code> fonction de non-blocage mode? Devrais-je utiliser
sélectionner () code> d'une manière ou d'une autre? P>
5 Réponses :
Qu'est-ce qui ne va pas avec Feof (stdin) code>? p>
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é.
Je ne sais pas si vous pouvez définir O_NONBLOCK sur stdin, mais SELECT () CODE> ou
Sondage () code> obtiendra certainement le travail. P>
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é.
Oui, vous pouvez utiliser Ainsi, le descripteur de fichier de sondage 0 occisionally avec Sélectionner code> (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 CODE> vous indique que le descripteur de fichier est lisible, puis un
lisez code> sur celui-ci ne bloquera certainement pas . p>
Sélectionnez CODE>, et s'il est lisible,
lisez code> it. Si
lisez code> renvoie 0, alors cela signifie qu'il a été fermé. P>
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 */
}
Sondage code> est également exactement ce que OP veut, et son interface est un peu plus facile que
Sélectionner code> lors de la gestion d'un petit jeu de descripteurs de fichier fixe.
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? p> blockQuote>
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. P>
Découvrez ioctl (..., Fionbio). Il semble faire le travail. P>