(linenum→info "unix/slp.c:2238")

glibc/2.7/nptl/eintr.c

    1: /* Copyright (C) 2003 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3:    Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #include <pthread.h>
   21: #include <signal.h>
   22: #include <unistd.h>
   23: 
   24: 
   25: static int the_sig;
   26: 
   27: 
   28: static void
   29: eintr_handler (int sig)
   30: {
   31:   if (sig != the_sig)
   32:     {
   33:       write (STDOUT_FILENO, "eintr_handler: signal number wrong\n", 35);
   34:       _exit (1);
   35:     }
   36:   write (STDOUT_FILENO, ".", 1);
   37: }
   38: 
   39: 
   40: static void *
   41: eintr_source (void *arg)
   42: {
   43:   struct timespec ts = { .tv_sec = 0, .tv_nsec = 500000 };
   44: 
   45:   if (arg == NULL)
   46:     {
   47:       sigset_t ss;
   48:       sigemptyset (&ss);
   49:       sigaddset (&ss, the_sig);
   50:       pthread_sigmask (SIG_BLOCK, &ss, NULL);
   51:     }
   52: 
   53:   while (1)
   54:     {
   55:       if (arg != NULL)
   56:         pthread_kill (*(pthread_t *) arg, the_sig);
   57:       else
   58:         kill (getpid (), the_sig);
   59: 
   60:       nanosleep (&ts, NULL);
   61:     }
   62: 
   63:   /* NOTREACHED */
   64:   return NULL;
   65: }
   66: 
   67: 
   68: static void
   69: setup_eintr (int sig, pthread_t *thp)
   70: {
   71:   struct sigaction sa;
   72:   sigemptyset (&sa.sa_mask);
   73:   sa.sa_flags = 0;
   74:   sa.sa_handler = eintr_handler;
   75:   if (sigaction (sig, &sa, NULL) != 0)
   76:     {
   77:       puts ("setup_eintr: sigaction failed");
   78:       exit (1);
   79:     }
   80:   the_sig = sig;
   81: 
   82:   /* Create the thread which will fire off the signals.  */
   83:   pthread_t th;
   84:   if (pthread_create (&th, NULL, eintr_source, thp) != 0)
   85:     {
   86:       puts ("setup_eintr: pthread_create failed");
   87:       exit (1);
   88:     }
   89: }
Syntax (Markdown)