Si je fais ceci :
x | y
existe-t-il un moyen de vérifier, pendant l'exécution de x, s'il est connecté à y ? Notez que je ne sais pas ce qu'est y et que je ne suis pas responsable de commencer y.
Plus précisément, je parle de l'environnement d'exécution Node.js, il s'agit donc peut-être d'une question spécifique à Node.js. Mais finalement, je me demande s'il est possible de déterminer le temps d'exécution. Est-ce possible et comment ?
Est-il possible de déterminer si les stdout/stderr sont connectés au stdin d'un autre processus ? Je suppose que c'est de cela qu'il s'agit.
Réponse acceptée :
Pour vérifier si la sortie du programme va dans un tube, basé sur https://nodejs.org/api/fs.html#fs_class_fs_stats, vous voulez appeler fs.fstat(FileDescriptor)
puis appelez isFIFO()
sur le stat
renvoyé objet (FIFO ==premier entré premier sorti ==un tube ou un tube nommé) :
$ </dev/null node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
false
$ : | node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
true
En C, vous feriez le fstat
syscall puis testez le .st_mode
champ de la struct stat
renvoyée en utilisant le S_ISFIFO
macro.
Si vous aimez gaspiller des cycles CPU et souhaitez utiliser un binaire externe, vous pouvez exécuter test -p /dev/fd/$THE_FD
pour obtenir la réponse (ou l'invoquer dans un shell où test
sera une fonction intégrée, ou exécutez stat
, ou lancez quelque chose d'autre capable de déterminer le type de fichier).