![]() Chapter Contents  | 
![]() Previous  | 
![]() Next  | 
| sigblkjmp | 
| Portability: | SAS/C extension | 
| SYNOPSIS | |
| DESCRIPTION | |
| RETURN VALUE | |
| CAUTION | |
| EXAMPLE | |
| RELATED FUNCTIONS | 
| SYNOPSIS | 
#include <lcjmp.h> int sigblkjmp(sigjmp_buf env);
| DESCRIPTION | 
sigblkjmp
requests interception of calls to 
longjmp
 or 
siglongjmp
that could terminate the calling function. When you call 
sigblkjmp
, it always returns 
0
. If a call to 
longjmp
 or 
siglongjmp
is later intercepted, the call to 
sigblkjmp
 is resumed and upon completion returns the integer argument
that was passed to 
longjmp
.
The 
env
 variable is modified
to indicate the target of the intercepted call so it can be resumed by a call
to 
siglongjmp
. 
Note:   When a 
siglongjmp
 call
is intercepted due to the use of 
sigblkjmp
, the signal mask has not yet been changed.  ![[cautionend]](../common/images/cautend.gif)
 
 After a call to 
longjmp
 or 
siglongjmp
 is
intercepted, 
sigblkjmp
must be re-issued if continued interception is wanted. 
Because 
exit
 is implemented
as a 
longjmp
 to the caller
of 
main
, you can use 
sigblkjmp
 to intercept program
exit.
| RETURN VALUE | 
sigblkjmp
 normally returns 
0
;
it returns a non-zero value if a call to 
longjmp
 or 
siglongjmp
has been intercepted (in which case 
sigblkjmp
 returns the value of the second argument passed to 
longjmp
 or 
siglongjmp
).
| CAUTION | 
Variables of storage 
class auto
 and 
register
 whose values are changed between the 
sigblkjmp
 and 
siglongjmp
 calls have indeterminate values on return to 
sigblkjmp
.
| EXAMPLE | 
This example demonstrates how 
sigblkjmp
 can be used to enable a function to release resources even
if terminated by a call to 
longjmp
 or 
siglongjmp
 in
a function that 
sigblkjmp
calls:  
#include <stdio.h>
#include <lcjmp.h>
#include <stdlib.h>
#include <lcsignal.h>
sigjmp_buf env;
static void get_resource(void), 
  use_resource(void);
int main()
{
  int code;
  if (code = sigsetjmp(env,1)) 
    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;
  sigjmp_buf my_env;
  sigset_t blockall, oldset;
  sigfillset(&blockall);
  /* block all signals while allocating 
     and using resource */
  sigprocmask(SIG_SETMASK, &blockall, 
              &oldset);
  /* Allocate resource here */
  if (code = sigblkjmp(my_env)) 
    goto release;
  puts("Resources allocated.");
  /* Free resource here */
  use_resource();
  puts("use_resource returned normally, "
    "get_resource is freeing resources.");
  setprocmask(SIG_SETMASK, &oldset, NULL);
  return;
 release:
  printf("use_resource indicated ", 
         "error %d\n", code);
  puts("Resources now freed, proceeding ",
       "with longjmp.");
  siglongjmp(my_env, code);
}
static void use_resource(void)
{
  puts("Entering use_resource.");
  /* Attempt to use resource here. */
  puts("Error 3 detected, ",
       "calling siglongjmp.");
  siglongjmp(env, 3);
  puts("This statement will not ",
       "be executed.");
}
| RELATED FUNCTIONS | 
blkjmp
, 
longjmp
, 
setjmp
, 
siglongjmp
, 
sigsetjmp
![]() Chapter Contents  | 
![]() Previous  | 
![]() Next  | 
![]() Top of Page  | 
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.