![]() Chapter Contents |
![]() Previous |
![]() Next |
| blkjmp |
| Portability: | SAS/C extension |
| SYNOPSIS | |
| DESCRIPTION | |
| RETURN VALUE | |
| CAUTION | |
| EXAMPLE | |
| RELATED FUNCTIONS | |
| SEE ALSO |
| SYNOPSIS |
#include <lcjmp.h> int blkjmp(jmp_buf env);
| DESCRIPTION |
blkjmp
requests interception of calls to
longjmp
that could terminate the calling function. When you call
blkjmp
, it always returns 0. If a call to
longjmp
is later intercepted, the call to
blkjmp
is resumed and it then returns the integer argument that was
passed to
longjmp
. The
env
variable is modified to indicate the target of the intercepted
longjmp
so that it can be reissued by the intercepting
routine.
After a call to
longjmp
is intercepted,
blkjmp
must be
reissued if continued interception is wanted.
Because
exit
is implemented
as a
longjmp
to the caller of
main
, you can use
blkjmp
to intercept
program exit.
Note:
<arjump.h> should be included only in an SPE application.
![[cautionend]](../common/images/cautend.gif)
| RETURN VALUE |
blkjmp
normally returns 0; it returns a non-zero value if a call to
longjmp
has been intercepted (in which case,
blkjmp
returns the value of the second argument passed to
longjmp
).
| CAUTION |
Variables of storage class
auto
and
register
whose values are
changed between the
blkjmp
and
longjmp
calls have indeterminate values on return to
blkjmp
.
| EXAMPLE |
This example demonstrates how
blkjmp
can be used to enable a function to release resources, even
if terminated by a call to
longjmp
in a
function it calls:
#include <stdio.h>
#include <lcjmp.h>
#include <stdlib.h>
jmp_buf env;
static void get_resource(void), use_resource(void);
int main()
{
int code;
if (code = setjmp(env)) goto escape;
get_resource();
puts("get_resource returned normally.");
exit(0);
escape:
printf("Executing escape routine for error %d\n", code);
exit(code);
}
static void get_resource(void)
{
int code;
jmp_buf my_env;
/* Allocate resource here. */
if (code = blkjmp(my_env)) goto release;
puts("Resources allocated.");
/* Free resource here. */
use_resource();
puts("use_resource returned normally, "
"get_resource is freeing resources.");
return;
/* Free resource here. */
release:
printf("use_resource indicated error %d\n", code);
puts("Resources now freed, proceeding with longjmp.");
longjmp(my_env, code);
}
static void use_resource(void)
{
puts("Entering use_resource");
/* Attempt to use resource here. */
puts("Error 3 detected, calling longjmp.");
longjmp(env, 3);
puts("This statement will not be executed.");
}
| RELATED FUNCTIONS |
longjmp
,
setjmp
,
siglongjmp
,
sigsetjmp
| SEE ALSO |
![]() Chapter Contents |
![]() Previous |
![]() Next |
![]() Top of Page |
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.