/* $Id$ */ /* Copyright (C) 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2003. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include #include #include #include #include volatile int count; void sh (int sig) { ++count; } int main (void) { struct sigaction sa; sa.sa_handler = sh; sigemptyset (&sa.sa_mask); sa.sa_flags = SA_RESETHAND; sigaction (SIGCHLD, NULL, NULL); if (sigaction (SIGCHLD, &sa, NULL) < 0) { printf ("sigaction set failed: %m\n"); exit (1); } if (raise (SIGCHLD) < 0) { printf ("first raise failed: %m\n"); exit (1); } if (raise (SIGCHLD) < 0) { printf ("second raise failed: %m\n"); exit (1); } if (count != 1) { printf ("signal handler not called 1 times\n"); exit (1); } if (sigaction (SIGCHLD, NULL, &sa) < 0) { printf ("sigaction get failed: %m\n"); exit (1); } if (sa.sa_handler != SIG_DFL) { printf ("sigaction retrieved sa_handler: %p\n", sa.sa_handler); exit (1); } /* `SA_RESTORER' gets set on `glibc-2.3.4-2.25.i686' but not on `glibc-2.5-7.i686'. */ #ifndef SA_RESTORER #define SA_RESTORER 0x04000000 #endif if ((sa.sa_flags & ~SA_RESTORER) != SA_RESETHAND) { printf ("sigaction retrieved sa_flags: 0x%x\n", sa.sa_flags); exit (1); } exit (0); }