Gestion des descripteurs de fichiers sous Unix

J’ai du mal à programmer mon shell pour qu’il exécute correctement la redirection d’E / S du fichier. J’ai l’impression que c’est ainsi que se passe l’algorithme.

Étant donné une commande: cat file > newfile

Mon sh fait comme suit:

1) Analyser la commande en 2 parties, cat file et newfile

2) fd = open(newfile, O_WRONLY | O_CREAT) // This opens the newfile for write or creates the file if it does not exist.

3) close(0) // close stdout

4) dup(fd) // this should copy the file descriptor for newfile into stdout since stdout is available

A partir de là, je pensais que j’avais terminé et que tous les résultats étaient en fd 0 (par exemple, printfs (), write (0, buf, 64), etc.) iraient dans mon nouveau fichier. Cependant, dès que je fais ceci, mon programme boucle l’erreur «fd 0 n’est pas ouvert pour READ», ce qui semble correct car 0 devrait être mon fichier qui n’est PAS lu. Je ne suis pas sûr de ce qui tente de lire à partir de 0 si.

Est-ce que cette logique est correcte ou est-ce que je manque juste quelque chose? Merci

3) close(0) // close stdout

Mais 0 est vraiment stdin . POSIX déclare que dans

 The following symbolic constants shall be defined for file streams: STDERR_FILENO File number of stderr; 2. STDIN_FILENO File number of stdin; 0. STDOUT_FILENO File number of stdout; 1. 

Vous pouvez utiliser ces constantes symboliques pour éviter des erreurs similaires.