8 votes

Déterminer si un descripteur de fichier lisible est l'extrémité de lecture d'un tuyau

Je voudrais utiliser splice pour copier des données sans les recopier de STDIN_FILENO vers un descripteur de fichier (qui pourrait être un fichier régulier, un périphérique caractère ou bloc, un tube FIFO, ou toute autre chose qui peut être ouverte avec open). Pour utiliser splice, soit le descripteur de fichier source soit le descripteur de fichier cible doit être l'extrémité appropriée d'un tube, donc en général un tube est créé pour servir de tampon intermédiaire lorsque le programmeur veut copier des données sans les recopier de non-tube à non-tube. Cependant, si STDIN_FILENO est déjà l'extrémité de lecture d'un tube, alors je pourrais éviter cette étape et essayer de copier directement de STDIN_FILENO vers l'autre descripteur de fichier. Par conséquent, j'aimerais être en mesure de déterminer si STDIN_FILENO est l'extrémité de lecture d'un tube.

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

9voto

Uli Schlachter Points 2073

Pour obtenir des informations sur un descripteur de fichier 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 d'essayer d'abord d'utiliser splice() et si cela échoue (avec EINVAL?), revenir à votre magie.

2voto

Jonathon Reinhart Points 40535

En tant qu'alternative, lseek() échouera avec ESPIPE si "fd est associé à un tube, une socket ou un FIFO." Ainsi, une opération nulle lseek(fd, 0, SEEK_CUR) vous dira si le descripteur de fichier correspond à l'un de ceux-ci.

Dans ma situation, cela couvre tous les cas qui m'intéressaient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X