Newsgroup: it.comp.programmare
Titolo: Comunicazione interprocesso sotto windows? Come si fa senza PIPE?

Ciao a tutti,
In questi giorni un mio amico si è trovato a dover dare l'output di un
programma in pasto ad un altro(in particolare da uno script perl di
controllo macchina in Perl a GNUPlot).
Proviamo lo script sul mio pc con ubuntu linux e tutto ok, andiamo al
pc connesso alla macchina e nulla funzionava. Il problema, cercando su
internet, era legato al fatto che windows non usa le pipe e abbiamo
risolto con una versione di gnuplot che simula le pipe (pgnuplot.exe).
Ma se dovessimo trovarci in situazioni analoghe con altri programmi
come si fa?
O quantomeno dove si può trovare documentazione in merito?
La documentazione microsoft mi sembra molto criptica e poco
dettagliata.

framin ha scritto:

In che senso windows non usa le pipes?
dir /b | find "exe"
funziona benissimo.
Certo, non si tratta di una vera pipe, in quanto l'interprete di comandi 
crea un file temporaneo e lo passa al comando successivo, ma funziona.
Ho scritto cose anche complesse usando la shell di cygwin e tutto il set 
di comandi unix-like, appoggiandomi sulla pipe messa a disposizione 
dall'interprete di comandi dos/windows.
Puoi postare un caso particolare che dici che non funziona?

crea un file temporaneo e lo passa al comando successivo, ma funziona.
Un "file temporaneo"? dove l'hai letta questa cosa?

dettagliata.
Criptica e poco dettagliata questa? :
http://msdn2.microsoft.com/en-us/library/aa365574%28VS.85%29.aspx

Andrea Laforgia ha scritto:

Non ricordo dove l'ho letta.
Comunque se provi a dare un comando dall'output lungo e lo metti in pipe 
a qualcosa di interattivo, vedi il file temporaneo nella directory 
temporanea.
Per esempio
dir c:\ /s | edit
in %TEMP% si crea un file con un nome probabilmente generato in funzione 
del timestamp, nel mio caso
Aocjdgbm
che, andandolo a visualizzare contiene proprio l'output di dir c:\ /s
e dopo aver chiuso l'edit, sparisce.

Roberto Montaruli ha scritto:

Smentisco che in Windows a 32 bit non ci siano delle vere pipe.
Questo era vero per MS-DOS e quindi per Windows a 16 bit (cioe' fino a 
Windows 3.11), nei quali venivano creati file temoranei.
Da Windows 95 in poi, il kernel supporta sia pipe senza nome che pipe 
con nome, anche se in Windows 95/98/ME hanno alcune limitazioni ripetto 
a Windows NT/2000/XP/Vista.
Inoltre l'interprete di comandi CMD, a differenza di 
COMMAND.COM
, crea 
una pipe senza nome quando elabora il simbolo "|".
Il comando "dir c:\ /s | edit" a me non mi pare che crei un file 
temporaneo, e comunque non mi sembra un esempio appropriato, in quanto 
il comando "edit" non legge lo standard input.
Se provi il comando:
dir c:\ /s | find "a"
vedrai che il comando "find" incomincia ad emettere righe prima che il 
comando "dir" abbia finito di emettere le sue.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 comando "dir" abbia finito di emettere le sue.
Non sono in grado di valutare se sia vero: osservo una pausa di qualche 
attimo e poi comincia a scrivere righe sullo schermo.
Ci vorrebbe un comando effettivo, non dir che e' gestito direttamente 
dall'interprete, seguito da un altro comando effettivo, per verificare 
l'esatto comportamento della pipe.
Ad ogni modo, il risultato e' trasparente ai fini del problema in 
questione: c'e' sempre un output che diventa input del processo successivo.

 questione: c'e' sempre un output che diventa input del processo successivo.
Sono d'accordo.


Carlo Milanesi ha scritto:

Mi sa che stiamo parlando di due sistemi operativi differenti io e te:
io utilizzo win98, e come interprete di comandi il 
command.com
.
Su win98 non c'e' tasklist ne' il task manager.
Forse la differenza di comportamento della pipe sta tutta qui.

differenza di unix.
"Indubbio" in base agli esperimenti sbagliati che fai?
Non è così.
Quando si innestano comandi sotto Windows, viene usata una pipe vera
(il comando esterno "edit" che hai usato, non legge dalla pipe, come
ti hanno già fatto notare). Inoltre, dovresti ben sapere che i
comportamenti di Windows 9x/ME e gli NT cambiano notevolmente. Anche
il supporto di certe caratteristiche varia sensibilmente. Quando
cominci a dire cosa Windows supporta o non supporta (tempo presente),
abbi la compiacenza di riferirti a una versione aggiornata del sistema
operativo.

 operativo.
No.
Se si parla di windows, si parla di windows, a prescindere dalle versioni.
Se si parla di una versione particolare si deve indicare la versione.
Una prerogativa di windows deve essere vera per tutti i windows, 
altrimenti non e' una prerogativa di windows, ma solo di XP (o superiori).
Di conseguenza la pipe non e' una prerogativa di windows.
Lo e', a quanto dite voi, di XP.
Sul mio windows e' una falsa pipe, simulata, resa funzionante, ma non e' 
una pipe.
Il primo programma della catena scrive l'output in un file temporaneo.
Quando ha finito viene lanciato il secondo file della catena che riceve 
in input il file temporaneo, etc...
Se nelle versioni successive di windows abbiano cambiato le cose, me lo 
state dicendo voi, e prendo nota.
Cambiera' l'efficienza, non certo la funzionalita'.
Quindi mi confermi anche che il C ha introdotto la funzione pipe() sotto XP?

Quindi mi confermi anche che il C ha introdotto la funzione pipe() sotto XP?
pipe() non è una funzione standard, quindi non puoi dire "il C ha
introdotto". Del C esiste una definizione standard che non fa
riferimento a caratteristiche dell'implementazione. Supportando tutti
gli NT (non solo XP) le pipe(), può esistere un'implementazione di C
che si poggi su di esse.

 introdotto". 
Allora riformulo una domanda: esiste ora come ora, una libreria che 
permetta di utilizzare la funzione pipe() in C sotto windows? e la popen() ?
E se si, per tutti i windows, o solo da una certa versione in poi?

E se si, per tutti i windows, o solo da una certa versione in poi?
http://cygwin.com/
Da parte mia la discussione è chiusa.

 Forse la differenza di comportamento della pipe sta tutta qui.
Mi sa che la situazione delle pipe senza nome in Windows e' la seguente.
- Fino alla versione 3.11 non sono supportate dal kernel, e quindi anche 
command.com
 le poteva solo simulare.
- In Windows 95/98/ME sono supportate dal kernel, e quindi qualche 
applicazione (come la shell bash di cygwin) le puo' usare, ma 
l'interprete di comandi 
command.com
 non le usa e si limita a simularle.
- In Windows NT/2000/XP/Vista sono supportate dal kernel, e l'interprete 
di comandi cmd.exe le usa effettivamente.


 altrimenti non e' una prerogativa di windows, ma solo di XP (o superiori).
Secondo questo tuo ragionamento *geniale*, quando si parla delle
funzionalita' di linux in generale, ci si riferisce certamente alle
sole presenti nel kernel 0.01.
ROTFL!
Saluti,
The Librarian

7h3.l1...@gmail.com
 ha scritto:

Non ci trovo niente da ridere.
O indichi il prerequisito di una precisa versione che implementa 
qualcosa che ti serve, oppure sottintendi che funziona su tutte le versioni.
Non e' affatto disdicevole indicare un prerequisito: lo e' invece il non 
indicarlo quando serve.

 indicarlo quando serve.
Io invece trovo che sia disdicevole arrampicarsi sugli specchi. Tanto
vale ammettere le cazzate, tanto le facciamo tutti.
Saluti,
The Librarian

7h3.l1...@gmail.com
 ha scritto:







Quindi in base al tuo punto di vista, si potrebbe tranquillamente
affermare che Windows supporta tranquillamente l'interfaccia AERO, perche'
basta che vi sia una versione che la supporta.
Vediamo di riportare la discussione in qualcosa di costruttivo.
Come risponderesti tu a queste due domande.
1) Windows supporta le pipe?
2) Windows supporta l'interfaccia aero?
Io credo che "si" sia una risposta sempre sbagliata in entrambi i casi,
mentre "no" sia una risposta che puo' essere vera in entrambi i casi.
Tu invece sostieni che "si" sia una risposta che puo' essere vera, mentre
"no" e' una risposta sbagliata.
Le risposte corrette dovrebbero essere "si, a partire dalla versione xyx".
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Le risposte corrette dovrebbero essere "si, a partire dalla versione xyx".
Il tuo puntiglio cozza alquanto con il fatto che tutta questa
discussione (inutile) e' nata dal fatto che tu sei stato impreciso.
Avresti dovuto dire "windows 98 non supporta le pipe" (sbagliando
tral'altro, visto che le supporta).
Saluti,
The Librarian

 qualcosa che ti serve, oppure sottintendi che funziona su tutte le versioni.
Io, ad esempio, trovo ovvio che con l'espressione "sono nato nel '79",
ci si riferisca implicitamente all'anno 1979 e non al 1379.
Ad ogni modo, discussione divertente. :)
Sarebbe il massimo se ora l'OP se ne uscisse con "...ma io lavoro su
Windows 98".

Certo che è bello fare un post in un ng dove chiedi un'informazione
gentilmente e, non solo ti si risponde abbastanza sgarbatamente, ma la
richiesta di informazioni diventa un flame...
Complimenti a voi programmatori.
Addio

framin ha scritto:

Ma sei tu che hai detto che il problema e' che Windows non usa le pipe!
Ti e' stato detto che il problema non puo' essere quello, dato che 
Windows *usa* le pipe.


 Complimenti a voi programmatori.
Se non hai soldi per corda e sapone, te li compro io.
Ti trovo pure il ramo, vah.
-- 
cc = callcc {|cc| cc.call cc}; cc.call cc