Newsgroup: it.comp.programmare.win32
Titolo: monitorare standard input con select

Con la select in linux č possibile controllare il descrittore dello
standard input (e quindi accorgersi quando viene scritto qualcosa
sulla tastiera) in modo simile a questo:
FD_ZERO(&rfd);
FD_SET(&rfd, fileno(stdin))
.
.
.
select(0, rfd, NULL, NULL, NULL);
if (IS_SET(&rfd, fileno(stdin))
{
	recv(fileno(stdin),buf,sizeof(buf),0);
	//in buf ho una riga scritta da tastiera
	.
	.
	.
}
il problema č che select in linux mi accessa un descrittore di sistema
(quindi anche il descrittore dello standard input) e la select in
windows accetta solo socket. E' possibile far monitorare da select
anche lo standard input?

la select funziona solo coi descrittori dei socket (anche se sono
implementati come veri HANDLE) perché tale funzione è supportata solo per
compatibilità con quelle schifezze disumane dei socket di Berkeley;
normalmente per gli HANDLE di Windows si usa WaitForSingleObject o
WaitForMultipleObjects.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

WaitForMultipleObjects.
non c'è modo di "fargli credere" a select di avere a che fare con un
socket anche se è solo l'handle dello standard input? Ho provato con i
cast ma senza successo.
Perchè altrimenti l'unica soluzione è quella di creare un nuovo thread
con il compito di monitorare con WaitForSingleObject lo standard
input. Nello stesso thread non posso farlo perchè se select non
"monitora" lo standard input, non uscirà.

 compatibilità con quelle schifezze disumane dei socket di Berkeley;
Probabilmente la schifezza è dall'altra parte ;-).
Ad esempio WaitForMultipleObjects può gestire non più di 64 oggetti:
http://twistedmatrix.com/trac/browser/trunk/twisted/internet/win32eventreactor.py
Inoltre, francamente, l'API POSIX per l'accesso ai descritori di file è
molto più elegante.
Per accedere in modo sincrono con Windows è un macello, con POSIX molto
meglio (*e* il file HANDLE per la lettura su console *non* supporta le
operazioni asincrone).
Saluti  Manlio Perillo

 operazioni asincrone).
ah be' sicuramente è molto meglio la scanf


 cast ma senza successo.
cosa speravi che succedesse con un cast? :D


 
Eh?
Che centra scanf?
Sto dicendo che se voglio leggere qualcosa dalla console e fare altro
mentre attendo l'input dell'utente, non posso farlo.
Almeno non usando OVERLAPPED e simili.
Saluti  Manlio Perillo

 mentre attendo l'input dell'utente, non posso farlo.
e io dicevo che non costituisce nessuno svantaggio rispetto a Unix, dove
per prendere dallo standard input o uso scanf (che è comoda ma deprecata)
oppure leggo un carattere alla volta con getchar.
se vogliamo cambiare design e spostarci sulla select di POSIX per
attendere che arrivi qualcosa sullo standard input allora possiamo fare lo
stesso su Windows con WaitForXxxObject, ma in entrambe le piattaforme
avremo bisogno di un secondo thread


cosa speravi che succedesse con un cast? :D
Ci ho provato :-)

 
Su Posix non mi risulta ci sia bisogno di un secondo thread.
Su Windows non sono riuscito ancora a capire come usare WaiForXXXObject
su un HANDLE di console.
Saluti  Manlio Perillo

 su un HANDLE di console.
proverò dopo le vacanze (visto che domani parto :P)
se tu me ne ricordi l'1 Settembre...


 
Sembra ci sia scritto espressamente nella documentazione che non è
possibile, non ricordo dove però.
Saluti e buone vacanze!
Manlio perillo

Quando select ritorna si vede quali descrittori sono pronti.
Di solito che timeout viene utilizzato per evitare un vero e proprio
polling ma allo stesso tempo evitare blocchi prolungati? Un decimo di
secondo può andare?