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 |