Newsgroup: it.comp.os.linux.development
Titolo: Quanti timer per processo?

Come da oggetto, quanti timer possono essere eseguiti concorrenzialmente in
un processo? Nel posto SIGPROF e SIGUSR1 vi ho detto dei miei problemi con
ITIMER_PROF e ITIMER_VIRTUAL. Quindi, da quanto ne so rimane sono
ITIMER_REAL. Esistono altri modi per avviare un timer? Grazie. DaN
-- 
Lo guardo' in viso, e riconobbe tutti gli uomini che aveva incontrato
durante la sua vita.

 ITIMER_REAL. Esistono altri modi per avviare un timer? Grazie. DaN
Come gia' ti ho detto, non ho mai conosciuto setitimer(), ma provo
a fare delle deduzioni:
da man alarm:
"
NOTES
  alarm and setitimer share the same timer; calls to one  will  interfere
  with use of the other.
  sleep()  may  be implemented using SIGALRM; mixing calls to alarm() and
  sleep() is a bad idea.
"
Quindi sospetto che ne hai solo uno, di cui puoi decidere solo a quale
dei tre riferimenti temporali relativi associare. Ripeto che vado solo
per deduzione visto che alarm() condivide lo stesso timer e farebbe
interferenza. Non mi pare che nella manpage ci sia qualcosa che faccia
intuire la concorrenzialita'. (?????)
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Roberto.
http://www.scit.wlv.ac.uk/cgi-bin/mansec?2+setitimer
qui la pensano diversamente:
"
NOTES
  The microseconds field should not be  equal  to  or  greater
  than one second.
 The setitimer() function is independent of the alarm() function.
"
Ci rinuncio.


Roberto C ha scritto:
RETTIFICA:
ho modificato il codice trovato in
http://www.quepublishing.com/articles/article.asp?p=23618&seqNum=14&rl=1
in questo modo e sembra proprio che SIGALRM e SIGVTALRM abbiamo
timers interindipendenti.
---------------
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
void timer_handler (int signum)
{
 static int count = 0;
 printf ("timer expired %d times\n", ++count);
}
void timer_handler2 (int signum)
{
 static int count = 0;
 printf ("timer 2 expired %d times\n", ++count);
}
int main ()
{
 struct sigaction sa;
 struct itimerval timer;
 struct itimerval timer2;
 /* Install timer_handler as the signal handler for SIGVTALRM. */
 memset (&sa, 0, sizeof (sa));
 sa.sa_handler = &timer_handler;
 sigaction (SIGVTALRM, &sa, NULL);
 memset (&sa, 0, sizeof (sa));
 sa.sa_handler = &timer_handler2;
 sigaction (SIGALRM, &sa, NULL);
 /* Configure the timer to expire after 250 msec... */
 timer.it_value.tv_sec = 0;
 timer.it_value.tv_usec = 250000;
 /* ... and every 250 msec after that. */
 timer.it_interval.tv_sec = 0;
 timer.it_interval.tv_usec = 250000;
 timer2.it_value.tv_sec = 0;
 timer2.it_value.tv_usec = 750000;
 timer2.it_interval.tv_sec = 0;
 timer2.it_interval.tv_usec = 750000;
 /* Start a virtual timer. It counts down whenever this process is
   executing. */
 setitimer (ITIMER_VIRTUAL, &timer, NULL);
 setitimer (ITIMER_REAL, &timer2, NULL);
 /* Do busy work. */
 while (1);
}
-----------
comunque mi fido poco di questa syscall.
ciao


 ITIMER_REAL. Esistono altri modi per avviare un timer? Grazie. DaN
forse č una domanda scontata ma sei sicuro che il sigusr1 venga ricevuto
e processato dal tuo programma? hai provato a fargli fare qualcosa di
diverso da avviare il timer? che so una printf?
i timer diversi possono coesistere perň devi stare attento perchč virtual
e prof quasi mai coincidono con il tempo reale.. quindi dovresti provare a
gestire il tutto con un solo timer.. e un handler che gestisca i vari
eventi.. per esempio potresti usare un timer che ticchetta a 1Hz e dei
contatori che si incrementano ad ogni ciclo..
devi anche stare attento alle altre funzioni che generano gli stessi
segnali come alarm..
-- 
[Filippo...........................]
[Linux User #342745................]
        ==[...penguin powered...]==