programma un "filtro" è semplicemente un programma che legge dal flusso di input standard (stdin
) e scrive sul flusso di output standard (stdout
). Prima di scrivere i dati letti, i dati vengono in genere trasformati in qualche modo (se non si preforma alcuna trasformazione o filtraggio, in pratica si scrive un programma cat
che stampa solo ciò che gli viene dato). La potenza del programma di filtraggio deriva dal fatto che non dettano da dove proviene il loro input o dove sta andando l'output. Invece, è compito del chiamante del programma fornire i canali di input/output.
Il nucleo di un programma di filtro potrebbe essere simile a questo (è possibile utilizzare questo come modello per i propri programmi di filtro):
#include <stdio.h>
int filter(FILE *input, FILE *output);
int main(void)
{
const int retval = filter(stdin, stdout);
fflush(stdout);
return retval;
}
Questo è tutto. Il lavoro effettivo viene svolto da una funzione filter
che esegue la trasformazione desiderata.Per esempio, ecco un semplice programma che legge i caratteri dal file di input, li trasforma in minuscolo, e poi li stampa per il file di output:
#include <stdio.h>
#include <ctype.h> /* for tolower */
int filter(FILE *input, FILE *output)
{
while (!feof(input)) {
if (ferror(input)) {
return 1;
}
fputc(tolower(fgetc(input)), output);
}
return 0;
}
int main(void)
{
const int retval = filter(stdin, stdout);
fflush(stdout);
return retval;
}
Se si compila e si esegue questo programma, sarà semplicemente sedersi lì e attendere pazientemente i dati da leggere dal file di input standard stdin
. Questo file è solitamente associato alla console, il che significa che devi inserire alcuni dati a mano. Tuttavia, le shell di comando implementano una funzione chiamata pipe che consente di inviare l'output di un comando all'input di un altro. Ciò consente di comporre più programmi in un pipeline per formare potenti comandi.
Ecco come potremmo usare il nostro programma di filtro (supponendo di aver chiamato il conseguente binario lower
):
$ echo Hello | lower
hello
$
Poiché il nostro programma di filtro non definisce in cui i dati da leggere è venuta da, possiamo combinare con tutti i tipi di programmi che producono output su stdout
. Per esempio, ecco come si può ottenere un intero file in minuscolo (è possibile utilizzare type
su macchine Windows, invece):
$ cat myfile.txt
Hello, World!
This is a simple test.
$ cat myfile.txt | lower
hello, world!
this is a simple test.
$
Mi sto perdendo qualcosa? 1 aprile era un paio di giorni fa ... –
Per tutti gli strumenti che hai menzionato, puoi facilmente trovare il codice sorgente. Perché non dare un'occhiata a questo per scoprire come sono implementati? –
@ Michael, no, è venuto fuori quando stavo rispondendo ad un'altra domanda, e ho capito che non c'era dubbio che coprisse questo. Come da linee guida (SO inteso per tutti i livelli di utenti e rispondere alle tue stesse domande), ho pensato di metterlo su. Ovviamente, io so come farlo, ma non ripeterò la puttana, lasciando che qualcun altro risponda (a meno che non lo facciano in un colpo di giorno nel qual caso, mi riproporrò al massimo :-) – paxdiablo