2010-05-21 5 views
0

J'ai un descripteur de fichier ouvert à la lecture qui peut être non-bloquant. Ce que je dois faire est simplement de lire toutes les données jusqu'à atteindre EOF et écrire ces données dans un descripteur de fichier accessible en écriture. Comme le processus qui effectue cette copie n'est pas "conscient" de tout ce qui se passe autour, je ne pense pas que je puisse faire quelque chose d'utile en attendant des données, et je ne veux pas utiliser une boucle while (alors que errno n'est pas EAGAIN) parce que je pense que ce serait un gaspillage. Existe-t-il un moyen de bloquer ou de suspendre l'exécution du processus de copie jusqu'à ce que les données soient disponibles?Force le blocage lu après EAGAIN?

Répondre

3

Votre autre réponse simplement O_NONBLOCK met à l'arrêt, qui définit le fichier à bloquer. C'est parfaitement bien, si cela fonctionne dans votre situation; mais sinon, vous pouvez utiliser select() pour bloquer jusqu'à ce que votre descripteur de fichier non bloquant soit lisible.

2

Chapitre 7 du générique HOWTO SCSI Linux (sg) donne an example de la façon de le faire:

int flags = fcntl(fd, F_GETFL); 
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK)); 
Questions connexes