Newsgroup: it.comp.os.linux.development
Titolo: differenza tra sleep e pause

Qualcuno mi spiega la differenza tra queste due funzioni? Io ho trovato 
solo questo:
1)La system call pause() pone in attesa il processo corrente, finche' 
non viene ricevuto un segnale.
2)La funzione sleep() sospende il processo corrente per seconds secondi 
o fino all'arrivo di un segnale che non sia ignorato.
Non capisco pero' la differenza tra porre in attesa e sospendere.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 Qualcuno mi spiega la differenza tra queste due funzioni?
Credo che pause sia piu' a basso livello: la sleep si appoggia 
a pause e alarm.
Ciao,
-- 
MoonChild
Togliere nospam per l' esatta e-mail 
UIN-ICQ: 3634753 

 
La funzione sleep(), blocca il processo, dando agli altri la possibilità 
di essere eseguiti, e durante il blocco può tornare se il segnale è tipo
SIGKILL cioè non ignorabile dal programma settando un signal handler.

 SIGKILL cioè non ignorabile dal programma settando un signal handler.
Con SIGKILL non si torna da nessuna parte :)
Ciao,
-- 
Daniele Orlandi

 Con SIGKILL non si torna da nessuna parte :)
Era inteso ritorno alla funzione del programma, per poi terminare
l'esecuzione dello stessa!

 Non capisco pero' la differenza tra porre in attesa e sospendere.
La differenza fra le due e` che pause puo` bloccare il processo (metterlo
in stato sleep) per un tempo indefinito, finche` non arriva un segnale,
mentre sleep lo mette in stato sleep per un periodo definito di tempo e
poi ritorna comunque.
Comunque il processo va sempre in stato di sleep (in ambo i casi) anche perche` 
sleep normalmente usa pause e alarm, motivo per cui non e` sano mescolare
chiamate a sleep e ad alarm
Ciao
Simone 

 l'esecuzione dello stessa!
Se era inteso cosi` era inteso male. 
Come ti hanno gia` detto con SIGKILL il processo viene terminato e basta,
non si ritorna da nessuna parte. 
Una pause ritorna, ma se viene ricevuto un segnale intercettabile
(ovviamente non SIGKILL) quando il relativo manipolatore ritorna.
Ciao 
Simone

 completamente diverso e stai facendo una gran confusione.
Dovresti studiare un'pò di più e non basarti solo su quella guida...
l'affidabilità dei segnali, non riguarda solo l'impostazione automatica 
del segnale di default. Nei sistemi unix precedenti, i segnali potevano
essere persi:
do {
     if (flag == 0)
	/* esegui istruzione */
     pause();
}
 
se qui, tra l'if e la pause si verifica un segnale, questo sarà persa...
ma se prima dell'if viene messa la seguente:
sigblock(sigmask(SIGINT)); // bsd 3.4
sighold(SIGINT) // system 5
viene garantito che il segnale viene bloccato (holding in system 5 e 
blocking in BSD).
do {
     sigblock(sigmask(SIGINT)); /* trattenuto fino alla pause().	
     if (flag == 0)
	/* esegui istruzione */
     pause();
}
DA QUI, pause non permette di gestire il segnale(SIGINT) perchè bloccato
e quindi va sbloccato prima di eseguire la gestione; da qui
pause va sostituita da:
  sigpause(0) // bsd: prima resetta la maschera, e poi va in pausa e 
SIGINT viene rilasciato per essere gestito.
sigrelease(SIGINT) // system 5, identica cosa
In linux, sigprocmask(SIG_BLOCK, segnale) e sigsuspend(0)
Quello di cui parli tu, per evitare la race condition, riguarda
quando si verifica un segnale durante l'esecuzione di un signal handler
(perchè si è verificato un segnale da gestire) ed è attivabile con:
sigaction(SIGINT, struttura_sigaction, NULL)
la struttura sigaction, contiene sa_handler (gestore del segnale) e
sa_mask (CHE PERMETTE DI INDICARE LA MASCHERA DEI SEGNALI DA BLOCCARE
DURANTE LA GESTIONE DI UN'ALTRO SEGNALE).

La sleep() blocca un processo per un tempo determinato
sleep (5) //blocca il processo per 5 secondi
La pause() blocca un porcesso a tempo indeterminato, ovvero finche' tale
processo non riceve un signal
pause ();  //<----- signal
......
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG