
|
ILE permet d'utiliser en RPG 4 des fonctions écrites ou destinées au C/400.
dont une fonction alarm() de gestion de timeout
Cette fonction prend la forme suivante
Alarm
..................................................................
: D alarm PR 10U 0 extproc('alarm') :
: D secs 10U 0 value :
..................................................................
par exemple
/free
alarm(30);
rc = accept(sock: addr: size);
alarm(0);
/end-free
si la réponse de la fonction accept(), dépasse 30s un signal est envoyé.
|
Qu'est-ce qu'un signal ? c'est un message (souvent d'erreur),envoyé à un pgm (ou à un thread). le thread doit se déclaré à l'écoute d'un tel message,en lui associant un signal handler (routine à appeller en cas de signal) l'écoute d'un signal est enregistrée dans un "signal set" Tout cela est mis en place par : Qp0sEnableSignals() puis sigemptyset() initialise le signal set sigaddset() ajoute un signal au signal set et enfin, sigaction() indique les coordonnées d'une procédure à activer, liée au signal recu. |
Enabled
.......................................................................
:D Qp0sEnableSignals... :
:D PR 10I 0 extproc('Qp0sEnableSignals') :
:.....................................................................:
SigemptySet
.......................................................................
:D sigset_t s 20U 0 based(ptr_fictif) :
: :
:D sigemptyset PR 10I 0 extproc('sigemptyset') :
:D set like(sigset_t) :
:.....................................................................:
SigaddSet
.......................................................................
:D sigaddset PR 10I 0 extproc('sigaddset') :
:D set like(sigset_t) :
:D signo 10I 0 value :
:.....................................................................:
|
Sigaction
........................................................................
:D sigaction_t ds qualified :
:D align :
:D based(ptr_fictif) :
:D sa_handler * procptr :
:D sa_mask like(sigset_t) :
:D sa_flags 10I 0 :
:D sa_sigaction * procptr :
: :
:D sigaction PR extproc('sigaction') :
:D sig 10I 0 value :
:D act likeds(sigaction_t) const :
:D options(*omit) :
:D oact likeds(sigaction_t) :
:D options(*omit) :
:......................................................................:
sa_handler devant contenir le pointeur d'une procédure: %PADDR()
|
Exemple *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Set up a signal handler to receive the SIGALRM signal *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ P init_signals B D init_signals PI D act ds likeds(sigaction_t) /free Qp0sEnableSignals(); sigemptyset(act.sa_mask); sigaddset(act.sa_mask: SIGALRM); act.sa_handler = %paddr(alarm_recue); act.sa_flags = 0; act.sa_sigaction = *NULL; sigaction(SIGALRM: act: *omit); /end-free P E SIGALRM contient la valeur 14 voici la liste des signaux possibles : |
D SIGABRT C const(1) D SIGIOT C const(1) D SIGLOST C const(1) D SIGFPE C const(2) D SIGILL C const(3) D SIGINT C const(4) D SIGSEGV C const(5) D SIGTERM C const(6) D SIGUSR1 C const(7) D SIGUSR2 C const(8) D SIGIO C const(9) D SIGAIO C const(9) D SIGPTY C const(9) D SIGALL C const(10) D SIGOTHER C const(11) D SIGKILL C const(12) D SIGPIPE C const(13) D SIGALRM C const(14) D SIGHUP C const(15) D SIGQUIT C const(16) |
D SIGSTOP C const(17) D SIGTSTP C const(18) D SIGCONT C const(19) D SIGCHLD C const(20) D SIGCLD C const(20) D SIGTTIN C const(21) D SIGTTOU C const(22) D SIGURG C const(23) D SIGIOINT C const(23) D SIGPOLL C const(24) D SIGPCANCEL C const(25) D SIGPALRM C const(26) D SIGBUS C const(32) D SIGDANGER C const(33) D SIGPRE C const(34) D SIGSYS C const(35) D SIGTRAP C const(36) D SIGPROF C const(37) D SIGVTALRM C const(38) D SIGXCPU C const(39) D SIGXFSZ C const(40) |
sinon, la procédure appellée (le handler)
-----
P alarm_recue B
D alarm_recue PI
D signo 10I 0 value
/free
// vous n'êts pas obligé de faire qqchose
// la fonction "__errno" retournera de toutes façons
// EINTR ("interrupted by signal"= 3407) quand le signal
// sera recu !
//
// vous pouvez, ceci dit, gérer un flag
// ou faire du menage si besoin
//
/end-free
P E
|