Newsgroup: it.comp.os.linux.development
Titolo: no blocking

Ho bisogno di un aiuto:
come faccio a non rendere bloccante un programma in C che deve ricevere
dati da una connessione ?
non mi dite di usare select, perchè select è bloccante per il tempo di
timeout che gli viene imposto. Quindi, vorrei sapere un modo per non
bloccare il mio programma mentre stà aspettando dati che potrebbero
arrivare in un tempo indeterminato (5 secondi, come un minuto)
grazie

 timeout che gli viene imposto.
Se i dati arrivano prima del timeout, l'attesa della select()  viene
interrotta prima che questo scada. Se non vuoi attendere affatto metti zero
come timeout.
Credo che ci sia anche un meccanismo basato sui segnali, ma non l'ho mai
usato e mi sembra piu' complicato.
--
Alessandro Staltari
staltari(a)
geocities.com

mmm, I have something to say too :)

http://www.ecst.csuchico.edu/~beej/guide/net/html/clientserver.html#simpleserver
In generale puoi tranquillamente usare l'accept() o anche la recv()
entrambe sono bloccanti (i.e. finche' non ricevono dati "dormono" e restano
in attesa).
Il problema e' che non e' una buona idea usare questo metodo per il semplice motivo
che vedrai il tuo bel programmino in attesa ai vertici del top...cioe'
sprechi tempo cpu.
Insomma devi usare la select :)
non e' cosi' difficile, setti i vari fildescriptor (quello della listener
ed eventualmente lo stdin) e piazzi la select in un bel ciclo (while(1)).
Non appena ricevi dati il metodo migliore sarebbe quello di eseguire una accept
e passare tutto al figlio (quindi forki). Il padre continuera' a restare in ascolto.
Sul sito li' sopra troverai molte info e alcuni sorgenti di esempi.
-- 
regards,
Ciro.
--
    Writing from the computer science department of Milan (DSI)
       home page at 
http://www.silab.dsi.unimi.it/~cs556770/
 
--

 Insomma devi usare la select :) [...]

 (è difficile da spiegare :\)
1) se la select la metti in un thread? <----
2) se invece di fare select con timeout la fai senza (tipo polling) o con
timeout basso (tipo 100ms) ?
P.S. ma come la usi la select? se la usi decentemente la recv non si deve
bloccare dopo...

 
ma come faccio ad usare la select se non so quando devono arrivare i
dati.. magari ora, magari tra un minuto, magari tra 10 minuti.. e che
timeout devo mettere alla select ? .. e nel frattempo il programma ?...
cmq ho risolto da solo
(ma se avete ancora idee postate)
grazie

 timeout devo mettere alla select ? .. e nel frattempo il programma ?...
Usa la gdk_input_add (o g_io_watch_*, se usi le GTK 2.0).
Bye,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)           [ 
http://www.radiance.d2g.com/~zefram
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

 ha scritto nel messaggio
news:20020405.011139...@hotmail.com...

ma la select per cosa la stai usando? è la risposta a tutte le tue
domande...

 nella funzione select() e la consecutiva recv() bloccando l'intero
allora devi usare pthread ... cosi' avrai due "cursori" ... uno che 
ritorna alla Gtk main... l'altro che si occupa della tua select..
Ricorda pero' che se da un thread vuoi accedere all'interfaccia GTK
lo devi fare tramite timeout per sincronizzarto con la GTK main...
senno' ti cazzia Xlib... :)
ciao e buona fortuna...

 
grazie tutti. ho trovato molto utile (e ho risolto il problema) con la
chiamata gdk_input_add che non conoscevo


non puoi definire una idle delle gtk? gtk_idle_add() forse... poi ci metti
dentro la select con un piccolo timeout
ciao

 in attesa ai vertici del top...cioe' sprechi tempo cpu.
Quando il programma e` bloccato in attessa di I/O non occupa cicli della
CPU, viene messo a dormire dal kernel.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La mia teoria scientifica preferita e` quella secondo la quale gli 
 anelli di Saturno sarebbero interamente composti dai bagagli andati 
 persi nei viaggi aerei." -- Mark Russel