Pagina 1 di 1
pipe
Inviato: ven 19 feb 2010, 14:32
da blackman85
Salve a tutti!!
Supponendo che abbia realizzato un programma c di nome test.o se eseguo questo comando da shell:
cosa devo scrivere nel programma per recuperare l'output di echo?
Grazie a tutti...
Re: pipe
Inviato: ven 19 feb 2010, 14:47
da ulisse89
Non ne sono sicuro, ma penso siano gli argomenti del main del programma test.
argc è il numero di stringhe passata e argv è vettore in cui ogni elemento punta ad ogni stringa.
Re: pipe
Inviato: ven 19 feb 2010, 14:53
da blackman85
ulisse89 ha scritto:Non ne sono sicuro, ma penso siano gli argomenti del main del programma test.
argc è il numero di stringhe passata e argv è vettore in cui ogni elemento punta ad ogni stringa.
No ti sbagli...avevo già provato così....grazie per la risposta!

Re: pipe
Inviato: ven 19 feb 2010, 15:04
da ulisse89
Ah scusa. Devi usare la scanf come se fossero stringhe passategli dallo stdin.
EDIT: Faccio un esempio per non essere troppo criptico.
Programma "test":
Codice: Seleziona tutto
#include <stdio.h>
main()
{
char* ciao[40];
scanf("%s", ciao);
printf("%s", ciao);
}
Con questo programma se dai:
Ti viene stampato "quellochevuoi".
Re: pipe
Inviato: ven 19 feb 2010, 15:12
da blackman85
Ho capito ho risolto grazie!!!
Re: pipe
Inviato: ven 19 feb 2010, 16:15
da blackman85
Ora però come faccio a sapere se c'è una pipe? Perché se leggo dallo stdin e non c'è una pipe si blocca il programma fino a che non si preme invio...
Re: pipe
Inviato: ven 19 feb 2010, 18:13
da Ansa89
Dovresti controllare lo stato del buffer di stdin e, se è vuoto, far uscire il programma (o una qualunque altra azione scelta da te).
Re: pipe
Inviato: ven 19 feb 2010, 18:16
da Mario Vanoni
blackman85 ha scritto:Ora però come faccio a sapere se c'è una pipe? Perché se leggo dallo stdin e non c'è una pipe si blocca il programma fino a che non si preme invio...
Un programma C che legge stdin,
non puo` discernere da dove viene l'input,
vale per BSD/UNIX e vale per Linux.
Aggiungi una opzione -p (pipe) al tuo programma,
se lo chiami con l'opzione -p sei consapevole di quello che fai,
se lo chiami senza opzione esce, con o senza error message,
a tua discrezione.
Re: pipe
Inviato: ven 19 feb 2010, 18:47
da blackman85
Ansa89 ha scritto:Dovresti controllare lo stato del buffer di stdin e, se è vuoto, far uscire il programma (o una qualunque altra azione scelta da te).
avevo pensato a qualcosa del genere ma non ho idea di come fare....
Mario Vanoni ha scritto:blackman85 ha scritto:Ora però come faccio a sapere se c'è una pipe? Perché se leggo dallo stdin e non c'è una pipe si blocca il programma fino a che non si preme invio...
Un programma C che legge stdin,
non puo` discernere da dove viene l'input,
vale per BSD/UNIX e vale per Linux.
Aggiungi una opzione -p (pipe) al tuo programma,
se lo chiami con l'opzione -p sei consapevole di quello che fai,
se lo chiami senza opzione esce, con o senza error message,
a tua discrezione.
ottima idea però pensavo ai tool linux ad esempio se scrivo:
funziona correttamente senza alcun opzione -p
Re: pipe
Inviato: ven 19 feb 2010, 18:51
da Ansa89
I tool di linux lavorano con dei file di buffer (man mkfifo), quindi è come se wc prendesse in ingresso un file (proprio come è stato progettato).
Re: pipe
Inviato: ven 19 feb 2010, 19:04
da Mario Vanoni
blackman85 ha scritto:
ottima idea però pensavo ai tool linux ad esempio se scrivo:
funziona correttamente senza alcun opzione -p
wc(1) conta le righe dei/del file(s),
se non ci sono files, assume stdin,
senza input aspetta anche lui Godot.
Prova a fare un
wc
senza argomenti.
Re: pipe
Inviato: ven 19 feb 2010, 20:07
da targzeta
Rimembranze...
Codice: Seleziona tutto
#include <stdio.h>
int main()
{
char buff[30];
fread(buff, 2, 2, stdin);
printf("%s", buff);
return 0;
}
Molto rozzamente legge i primi 4 caratteri dello standard input. Se il programma non lo metti in pipe con qualcosa, allora si aspetta che sia tu a dargli qualcosa, altrimenti se lo metti in pipe funziona come chiedi. Ricorda che la pipe ridireziona lo standard output di un comando nello standard input di un altro.
Emanuele