The D3 monitor provides a system call to inform the D3 Virtual Environment of an incoming signal. This c function is called by the default signal system handlers, but also can be called by an application signal handler.
This function is defined:
#include "/usr/lib/pick/include/sigmon.h" void sigmon(code) int code;
where code is the action code, as described in the table below.
Code | Value | Description |
---|---|---|
db_slcout | 0 | No operation. This forces the process to examine its current state. This function must be called by the SIGUSR2 signal handler. |
db_privop | 7 | Privileged opcode. Sends the caller to the system debugger. This call does not return to the caller. This call can be used to abort a c program, even if it is not called from a signal handler. |
db_break | 10 | Interrupt. Sends the process to the FlashBASIC, or system debugger. This function must be called by the SIGINT signal handler. Going to the system debugger is not immediate. Normally, the process enters the debugger (or pushes a level) when the signal handler terminates. |
db_esc | 12 | Quit. Pushes a level. This function must be called by the SIGQUIT signal handler. Normally, the process pushes a level when the signal handler terminates. |
db_logoff | 14 | Log off. This function is normally called by the SIGHUP handler. It can be called by other signal handlers as part of the application (for example, SIGALRM, to log off a process after a given time). |
db_pwrdown | -1 | Disconnect. The process is disconnected from the virtual machine, but remains logged on. |
These examples use the signals in a D3 application and cooperate with UNIX applications. All examples require writing a c signal handler, which must be linked with the D3 monitor, as described in this document.
The purpose is to write a signal handler, which logs the user process off if there is no activity for a given time. It is assumed the user is in a FlashBASIC application, awaiting input.
Write the signal handler and function. For example:
setalrm.c: #include <signal.h> #include "/usr/lib/pick/include/sigmon.h" myalrm(){ /* signal handler. When activated, log the process off */ sigmon( db_logoff ); } /* Set the new signal handler. Set the signal handler to the application signal handler. return the address of the previous signal handler, so that the basic application can remove the time out */ void (*setalrm())(){ return signal(SIGALRM, myalrm ); } <
Compile the previous program and incorporate it into the D3 monitor.
Enter into the dm account:
addbi setalrm signal ar vru libgm.a setalrm.o make -f /usr/lib/pick/Makefile
Enter the application program. For example:
* * Reprogram the alarm handler, * keeping the previous system * handler * Note the function pointer * returned by the function * is treated as a pointer to a character. include dm,bp,unix.h signal.h old$alarm = (char*)%setalrm() * loop * Set the alarm to 10 minutes * From now on, if the user * doesn't enter a command before * 10 minutes, the process is logged off. %alarm(600) * .. display application entry screen here crt 'command : ': input command while 1 do begin case case command = 'a' *...put command 'a' routine case command = 'end' print 'end of the application' * disable the alarm and set the default alarm * handler back to the default. %alarm( 0 ) %signal( SIGALRM, (char*)old$alarm ) chain 'off' end case repeat