2009-12-11 3 views
0

Je veux lire la sortie du processus de mon enfant, mais pour une raison quelconque, il arrête de définir le POLLIN dans revents quand il y a encore une sortie à lire.polling des enfants stdout arrête le réglage de POLLIN après la première lecture

Voici ce que je fais:

  1. Fork mon processus
  2. créer tuyau
  3. dup2 (pipe [0], STDOUT_FILENO) mon de stdout enfant
  4. sondage le descripteur de fichier du tuyau (Je le fais avant d'avoir atteint EOF)
  5. sortie de lecture si POLLIN est réglé

la façon dont je vois si j'ai atteint un EOF est en mettant un drapeau dans une structure si après le sondage, il n'y avait pas de POLLIN défini dans revents.

(poll_fds[idx].revents & ~POLLIN) 

Maintenant, c'est toujours vraie même si POLLIN est réglé, je suppose que son beacuse un certain indicateur d'erreur est situé sur la bitmask, droit ??

la façon dont je teste mon programme est ./my_program/bin/ls

maintenant cela devrait imprimer la sortie de ls sur ma console mais il imprime seulement les 16 premiers octets (je l'ai lu() exactement 16 octets) .

Je ne sais pas pourquoi le drapeau d'erreur est en train de se fixer des idées?

EDIT: Je viens de voir que le drapeau qui est en train d'être réglé est POLLHUP ... mais je ne comprends pas pourquoi il est réglé si je n'ai pas encore lu tout le tuyau ??

+0

Y at-il une très bonne raison pour laquelle vous n'utilisez pas simplement 'popen()'? –

+0

J'utilise read pour m'assurer qu'il ne bloque pas. – woolagaroo

+0

La bonne façon de vérifier EOF est 'read' retournant 0. – caf

Répondre

1
(poll_fds[idx].revents & ~POLLIN) 

Que diable? Cela retourne true si des bits non-POLLIN sont définis. Vous voulez probablement l'un des

!(poll_fds[idx].revents & POLLIN) 
(~poll_fds[idx].revents & POLLIN) 
+0

vrai, il renvoie faux si POLLIN est réglé .... ce qui signifie que je ne suis pas fini. my_pipe-> in_EOF = (poll_fds [idx] .revents & ~ POLLIN); – woolagaroo

+0

Mais il retourne true si 'revents = (tout autre drapeau) | POLLIN'. – ephemient

+0

absolument vrai merci;) – woolagaroo

Questions connexes