2010-09-03 16 views
5

Je souhaite utiliser splice pour copier les données de STDIN_FILENO vers un descripteur de fichier (qui peut être un fichier normal, un dispositif char ou bloc, FIFO ou tout ce qui peut être ouvert avec open). Pour utiliser splice, le descripteur de fichier du ou le au descripteur de fichier doit être l'extrémité appropriée d'un canal, donc généralement un canal est créé pour servir de tampon intermédiaire lorsque le programmeur veut copier des données depuis zéro. non-tuyau à non-tuyau. Cependant, si STDIN_FILENO est déjà l'extrémité de lecture d'un canal, alors je pourrais sauter cette étape et tenter de passer directement de STDIN_FILENO à l'autre descripteur de fichier. Par conséquent, je voudrais être en mesure de déterminer si STDIN_FILENO est l'extrémité de lecture d'un tuyau.Déterminer si un descripteur de fichier lisible est l'extrémité de lecture d'un canal

Y at-il un appel système Linux qui peut déterminer si STDIN_FILENO est l'extrémité de lecture d'un canal?

Répondre

5

Pour obtenir des informations sur un fd ouvert, vous pouvez utiliser fstat(). Je suppose que st_mode du résultat devrait être S_IFIFO pour un tuyau. Alternativement,/proc/self/fd/et/proc/self/fdinfo/fournissent également des informations sur un descripteur de fichier. Gardez à l'esprit que/proc est spécifique à Linux.

Cependant, je pense qu'il pourrait être plus facile de simplement essayer d'utiliser splice() d'abord et si cela échoue (avec EINVAL?) Revenir à votre magie.

+4

Je codé un:. Http: // pastebin. com/ntauU2b5. Le résultat est que 'S_ISFIFO' sur le' st_mode' pour l'extrémité de lecture d'un tuyau est TRUE. Votre estimation est correcte, et elle est en fait conforme à la norme POSIX: "S_ISFIFO (m) Test pour un tube ** ou ** fichier spécial FIFO" (http://www.opengroup.org/onlinepubs/009695399/basedefs/sys /stat.h.html) –

1

En variante, lseek() échouera avec ESPIPE si «fd est associé à un tube, une socket ou une FIFO». Donc, un lseek(fd, 0, SEEK_CUR) no-op vous dira si le descripteur de fichier est l'un de ceux-ci.

Dans ma situation, cela couvre tous les cas, je me suis intéressé au programme de test qui a créé un tube, appelé `fstat`, et testé` S_ISFIFO`