PDA

Visualizza la versione completa : [C] Comando sort utilizzando una exec


Cyber-X91!
11-09-2013, 18:18
Salve ragazzi ho questo esercizio:

Si scriva un programma C che in successione

1) visualizzi su standard output la frase Ordiniamo FF;
2) scriva all’interno di un altro file SS il contenuto di FF in ordine inverso, utilizzando una delle
funzioni exec (senza l’utilizzo dell’operatore >) ed il comando sort -r;
3a) visualizzi su standard output la frasi Fatto!;
3b) visualizzi in successione su standard output le frasi Puoi controllare SS
e
Hai fatto un buon lavoro utilizzando due exit-handler.

Come si fa?
Soprattutto i punto 2 e 3B. Ho cercato in rete ma non trovo granchè
Grazie a tutti.

MItaly
12-09-2013, 16:50
Per il punto 2, chiudi lo standard output corrente (close(STDOUT_FILENO)), quindi apri il file di output (dato che la open usa il file descriptor più basso per i nuovi file descriptor, il file di output sarà automaticamente agganciato allo standard output); ripeti lo stesso gioco per il file di input (usando però STDIN_FILENO nella close).
Ora, chiamando execlp("sort", "sort", (char *)NULL);, sort si troverà lo standard input rimpiazzato dallo stream del tuo file, e lo standard output già puntato sul file di output, e procederà quindi ad ordinare il file di input, salvato nel file di output.

Per i punti 3, c'è un problema di fondo: nel momento in cui chiami la exec, il tuo codice smette di avere il controllo di alcunché, dato che stai dicendo al sistema operativo di rimpiazzare il codice del tuo programma con quello di sort; neanche gli exit handlers sopravvivono ad una exec, per cui probabilmente hai bisogno di fare una fork; il processo figlio farà quanto descritto sopra, mentre il processo padre attenderà (usando la wait) il termine del processo figlio e scriverà su standard output la frase del punto 3a; quanto al punto 3b, per registrare degli exit handler devi usare la funzione atexit.

Cyber-X91!
16-09-2013, 21:46
Ciao, scusami per il ritardo nel ringraziarti... Mi è stato utile grazie mille :)

MItaly
17-09-2013, 02:08
:ciauz:

Loading