Newsgroup: it.comp.lang.c
Titolo: Problemino...

Salve a tutti,
ho un problemino, sto implementando un piccola shell per unix per un
laboratorio di SO e devo ridirigere input e output per interpretare comandi
del tipo 'ls > pippo'.
Adesso non ho il codice a portata di mano ma il metodo che ho utilizzato e'
questo:
Sapendo che i file header di stdin e stdout sono rispettivamente 0 e 1
int fpmag,savemag;
/*Apro il mio file*/
fpmag=open(arg[narg],O_WR);   /*qui nessun problema*/
dup2(1,savemag);                        /*salvo le impostazioni di stdout*/
close(1);
dup(fpmag);                                 /*Assegna a fpmag il primo
libero (cioe' 1 perche' l'ho appena chiuso)*/
close(fpmag);
[...]
/* Una volta eseguito il comando devo rimettere le cose a posto......*/
dup2(savemag,1);
Ma non lo stdout non viene reimpostato come prima.
E' lecito quello che vorrei fare,cioe' salvare l'stdout attraverso savemag
prima di ridirigerlo?
(leggendo il man sembrerebbe di si)
Devo per forza aprire il file
x=open("/dev/tty",O_RW);
dup2(x,1);
per reimpostare lo stdout su schermo??
Grazie
Zag

 ho un problemino, sto implementando un piccola shell per unix per un
Ci sono NG più adatti di questo...
Comunque:
[root@fokhouse /tmp]# cat fd.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
        int i, fpmag, savemag = 127;
        write(1, "Comincio...", 11);
        fpmag = open("/tmp/pippone", O_WRONLY|O_CREAT, 0666);
        dup2(1, savemag); close(1);
        dup(fpmag); close(fpmag);
        for (i = 0; i < 5; i++)
                write(1, "Il mattino ha l'oro in bocca.\n", 31);
        dup2(savemag, 1); close(savemag);
        write(1, "tutto fatto !\n", 14);
        return 0;
}
[root@fokhouse /tmp]# ./fd
Comincio...tutto fatto !
[root@fokhouse /tmp]# cat pippone
Il mattino ha l'oro in bocca.
Il mattino ha l'oro in bocca.
Il mattino ha l'oro in bocca.
Il mattino ha l'oro in bocca.
Il mattino ha l'oro in bocca.
[root@fokhouse /tmp]#
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Andrea Foco wrote in message

Comunque:






Ok!Anch'io pensavo di fare cosi' jma una volta eseguito mi dava problemi a
reimpostare l'output.
Nessun errore,ma rimane aperto il file e tutto quello che scrivo va a file
invece che a schermo.
Sembra che la 'dup2(savemag,1);' non abbia effetto.Cmq ho risolto aprendo il
file "/dev/tty" ma non volevo ricorrere a questo per non essere legato alla
directory...
Domani riprovo e se non funziona ti posto il programma, sempre che tu abbia
tempo e voglia di guardarlo.
Grazie mille e scusa per il NG in cui ho postato!
(Quali sono quelli piu' adatti?? )
Zag

 (Quali sono quelli piu' adatti?? )
IMHO, it.comp.os.unix e it.comp.os.linux.development.


questo:
Vorrei darti un consiglio, anche se arriva un po' in ritardo....
Anche io ho implementato la shell di cui stai parlando e vorrei darti
un consiglio... se prima facessi una fork() e poi ridirigessi STDIN,
STDOUD o STDERR non sarebbe meglio? Anzi, e' proprio la soluzione che
dovresti adottare... nel padre STDIN, STDOUT e STDERR sonon
correttamente impostati e del filgio non ti devi piu' preoccupare.
Scusate l'OT.
Paolo