HP OpenVMS Systemsask the wizard |
The Question is: I am running an image (C program) as detached process. It has an Exit handler that runs during normal image exit. But when that process gets deleted by STOP/ID command, I understand that the Exit handler does not get executed. So, is there a way or work a round to ensure the execution of exit handler (or a clean up program) before process exits. Thanks, Arasu Ramalingam The Answer is :
It is the intent of OpenVMS that the STOP/ID command and the $delprc
system service not invoke application exit handlers; that these commands
cause the application and the process to exit.
The most obvious, documented, and fully supported approach is the use
of AUTHORIZE or similar tools to remove the GROUP or WORLD privilege
from those users not sufficiently versed in the dangers of the STOP/ID
command and the $delprc system service.
Alternatively, use the $forcex system service to delete the process,
or implement an interface (lock manager, mailbox, network, IP SNMP,
etc) through which a management tool can request the detached process
exit cleanly.
There are several undocumented approaches for protecting processes
against deletion or to invoke inner-mode handers, please see the
Internals and Data Structures manual. Alternatively, the User-Written
System Service (UWSS) mechanism can be used to enforce the rundown
processing.
An example of using $forcex follows:
// Copyright 2003 by Hewlett-Packard Company
// Copyright 1992, 1996 by Digital Equipment Corporation
//
// Written 1-Jan-1990, by Stephen Hoffman, OpenVMS Engineering
// Various subsequent (minor) updates
//
#include <ssdef.h>
#include <starlet.h>
#include <stdio.h>
main( int argc, char **argv )
{
unsigned long int retstat;
unsigned long int pid;
unsigned long int finalstat = SS$_BUGCHECK;
char hex[12];
if (( argc != 2 ) && ( argc != 3 ))
{
printf("this is a foreign command; usage: fx pid exitstat\n");
return SS$_BADPARAM;
}
sscanf( argv[1], "%x", &pid );
if ( argc == 3 )
sscanf( argv[1], "%x", &finalstat );
retstat = sys$forcex( &pid, 0, finalstat );
return retstat;
}
|