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:

Codice: Seleziona tutto

echo ciao questo è un test | ./test.o
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.

Codice: Seleziona tutto

main(int argc, char **argv)
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.

Codice: Seleziona tutto

main(int argc, char **argv)
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! :thumbright:

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:

Codice: Seleziona tutto

echo "quellochevuoi" | test
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:

Codice: Seleziona tutto

ps -e | wc
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:

Codice: Seleziona tutto

ps -e | wc
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