Redirection de STDIN, STDOUT, STDERR vers / dev / null en C

Dans la programmation réseau UNIX de Stevens, il mentionne la redirection de stdin, stdout et stderr, nécessaire pour configurer un démon. Il le fait avec le code C suivant

/* redirect stdin, stdout, and stderr to /dev/null */ open("/dev/null", O_RDONLY); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); 

Je ne comprends pas comment ces trois «savent» qu’ils redirigent les trois std *. Surtout que les deux dernières commandes sont les mêmes. Quelqu’un pourrait-il expliquer ou me diriger dans la bonne direction?

On suppose que les descripteurs de fichier 0, 1 et 2 ont déjà été fermés lorsque ce code est exécuté, et il n’y a pas d’autres threads susceptibles d’affecter de nouveaux descripteurs de fichier. Dans ce cas, étant donné que open est nécessaire pour toujours allouer le plus petit numéro de descripteur de fichier disponible, ces trois appels à ouvrir produiront les descripteurs de fichier 0, 1 et 2, à moins qu’ils n’échouent.

C’est parce que les descripteurs de fichier 0, 1 et 2 sont respectivement une entrée, une sortie et une erreur, et open capturera le premier descripteur de fichier disponible. Notez que cela ne fonctionnera que si les descripteurs de fichier 0, 1 et 2 ne sont pas déjà utilisés.

Et vous devriez faire attention aux termes utilisés, stdin , stdout et stderr sont en fait des descripteurs de fichier ( FILE* ) plutôt que des descripteurs de fichier, bien qu’il existe une corrélation entre ceux-ci et les descripteurs de fichier.