[gdb/testsuite] Factor out lib/valgrind.exp
[external/binutils.git] / gdb / testsuite / gdb.base / interrupt-daemon.c
1 /* This testcase is part of GDB, the GNU debugger.
2
3    Copyright 2017 Free Software Foundation, Inc.
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9
10    This program 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
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18 #include <unistd.h>
19 #include <stdlib.h>
20 #include <assert.h>
21
22 static void
23 daemon_main (void)
24 {
25 }
26
27 int
28 main ()
29 {
30   pid_t child;
31
32   alarm (60);
33
34   /* Normally we're a progress group leader at this point, so can't
35      create a session.  Fork so the child can create a new
36      session.  */
37   child = fork ();
38   if (child == -1)
39     return 1;
40   else if (child != 0)
41     return 0;
42   else
43     {
44       /* In child.  Switch to a new session.  */
45       pid_t session = setsid ();
46       if (session == -1)
47         return 1;
48
49       /* Fork again, so that the grand child (what we want to debug)
50          can't accidentally acquire a controlling terminal, because
51          it's not a session leader.  We're not opening any file here,
52          but this is representative of what daemons do.  */
53       child = fork ();
54       if (child == -1)
55         return 1;
56       else if (child != 0)
57         return 0;
58
59       /* In grandchild.  */
60       daemon_main ();
61
62       while (1)
63         sleep (1);
64     }
65
66   return 0;
67 }