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.