Repository 32bit  Forum
Repository 64bit  Wiki

pipe

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

pipe

Messaggioda blackman85 » ven feb 19, 2010 14:32

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...
Avatar utente
blackman85
Linux 2.4
Linux 2.4
 
Messaggi: 333
Iscritto il: dom giu 22, 2008 13:41
Slackware: 13.1 x86_64
Kernel: 2.6.33.4
Desktop: kde 4.4

Re: pipe

Messaggioda ulisse89 » ven feb 19, 2010 14:47

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.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: pipe

Messaggioda blackman85 » ven feb 19, 2010 14:53

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:
Avatar utente
blackman85
Linux 2.4
Linux 2.4
 
Messaggi: 333
Iscritto il: dom giu 22, 2008 13:41
Slackware: 13.1 x86_64
Kernel: 2.6.33.4
Desktop: kde 4.4

Re: pipe

Messaggioda ulisse89 » ven feb 19, 2010 15:04

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".
Ultima modifica di ulisse89 il ven feb 19, 2010 15:13, modificato 1 volta in totale.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: pipe

Messaggioda blackman85 » ven feb 19, 2010 15:12

Ho capito ho risolto grazie!!!
Avatar utente
blackman85
Linux 2.4
Linux 2.4
 
Messaggi: 333
Iscritto il: dom giu 22, 2008 13:41
Slackware: 13.1 x86_64
Kernel: 2.6.33.4
Desktop: kde 4.4

Re: pipe

Messaggioda blackman85 » ven feb 19, 2010 16:15

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...
Avatar utente
blackman85
Linux 2.4
Linux 2.4
 
Messaggi: 333
Iscritto il: dom giu 22, 2008 13:41
Slackware: 13.1 x86_64
Kernel: 2.6.33.4
Desktop: kde 4.4

Re: pipe

Messaggioda Ansa89 » ven feb 19, 2010 18:13

Dovresti controllare lo stato del buffer di stdin e, se è vuoto, far uscire il programma (o una qualunque altra azione scelta da te).
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: pipe

Messaggioda Mario Vanoni » ven feb 19, 2010 18:16

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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: pipe

Messaggioda blackman85 » ven feb 19, 2010 18:47

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
Avatar utente
blackman85
Linux 2.4
Linux 2.4
 
Messaggi: 333
Iscritto il: dom giu 22, 2008 13:41
Slackware: 13.1 x86_64
Kernel: 2.6.33.4
Desktop: kde 4.4

Re: pipe

Messaggioda Ansa89 » ven feb 19, 2010 18:51

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).
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: pipe

Messaggioda Mario Vanoni » ven feb 19, 2010 19:04

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.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: pipe

Messaggioda targzeta » ven feb 19, 2010 20:07

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6166
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite