C++程序  |  49行  |  917 B

/* Test of correct simulation for uc->uc_link in a signal handler. */

#include <assert.h>
#include <signal.h>
#include <stdio.h>
#include <ucontext.h>

static void sighandler(int sig, siginfo_t *sip, ucontext_t *ucp)
{
   ucontext_t uc2;

   /* Current uc_link value has to be equal to ucp. */
   getcontext(&uc2);
   assert(uc2.uc_link == ucp);
}

int main(void)
{
   ucontext_t uc;
   struct sigaction sa;

   /* Current uc_link value has to be NULL. */
   if (getcontext(&uc)) {
      perror("getcontext");
      return 1;
   }
   assert(!uc.uc_link);

   sa.sa_handler = sighandler;
   sa.sa_flags = SA_SIGINFO;
   if (sigfillset(&sa.sa_mask)) {
      perror("sigfillset");
      return 1;
   }
   if (sigaction(SIGUSR1, &sa, NULL)) {
      perror("sigaction");
      return 1;
   }

   raise(SIGUSR1);

   /* Current uc_link value has to be NULL. */
   getcontext(&uc);
   assert(!uc.uc_link);

   return 0;
}