xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/interrupt-daemon.c (revision 2dd295436a0082eb4f8d294f4aa73c223413d0f2)
1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2017-2020 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 }
68