Change section_offsets to a std::vector
[deliverable/binutils-gdb.git] / gdb / fork-child.c
CommitLineData
c906108c 1/* Fork a Unix child process, and set up to debug it, for GDB.
74a4fe32 2
b811d2c2 3 Copyright (C) 1990-2020 Free Software Foundation, Inc.
74a4fe32 4
c906108c
SS
5 Contributed by Cygnus Support.
6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
d55e5aa6 23#include "inferior.h"
4de283e4 24#include "gdbcmd.h"
d55e5aa6 25#include "terminal.h"
4de283e4 26#include "gdbthread.h"
d55e5aa6 27#include "top.h"
268a13a5
TT
28#include "gdbsupport/job-control.h"
29#include "gdbsupport/filestuff.h"
4de283e4 30#include "nat/fork-inferior.h"
268a13a5 31#include "gdbsupport/common-inferior.h"
6037b830 32
2090129c
SDJ
33/* The exec-wrapper, if any, that will be used when starting the
34 inferior. */
808480f6 35
2090129c 36static char *exec_wrapper = NULL;
808480f6 37
268a13a5 38/* See gdbsupport/common-inferior.h. */
808480f6 39
2090129c
SDJ
40const char *
41get_exec_wrapper ()
808480f6 42{
2090129c 43 return exec_wrapper;
808480f6
PA
44}
45
2090129c 46/* See nat/fork-inferior.h. */
808480f6
PA
47
48void
2090129c 49gdb_flush_out_err ()
808480f6 50{
2090129c
SDJ
51 gdb_flush (main_ui->m_gdb_stdout);
52 gdb_flush (main_ui->m_gdb_stderr);
6037b830 53}
c906108c 54
2090129c
SDJ
55/* The ui structure that will be saved on 'prefork_hook' and
56 restored on 'postfork_hook'. */
57static struct ui *saved_ui = NULL;
0db8980c 58
2090129c 59/* See nat/fork-inferior.h. */
0db8980c
SDJ
60
61void
2090129c 62prefork_hook (const char *args)
0db8980c 63{
3cb3b8df 64 const char *inferior_io_terminal = get_inferior_io_terminal ();
c906108c 65
2090129c
SDJ
66 gdb_assert (saved_ui == NULL);
67 /* Retain a copy of our UI, since the child will replace this value
68 and if we're vforked, we have to restore it. */
69 saved_ui = current_ui;
49940788 70
c906108c
SS
71 /* Tell the terminal handling subsystem what tty we plan to run on;
72 it will just record the information for later. */
c906108c 73 new_tty_prefork (inferior_io_terminal);
2090129c 74}
c906108c 75
2090129c 76/* See nat/fork-inferior.h. */
c906108c 77
2090129c
SDJ
78void
79postfork_hook (pid_t pid)
80{
08036331 81 inferior *inf = current_inferior ();
6c95b8df
PA
82
83 inferior_appeared (inf, pid);
7f9f62ba 84
2090129c 85 /* Needed for wait_for_inferior stuff. */
f2907e49 86 inferior_ptid = ptid_t (pid);
c906108c 87
2090129c
SDJ
88 gdb_assert (saved_ui != NULL);
89 current_ui = saved_ui;
90 saved_ui = NULL;
191c4426 91
2090129c 92 new_tty_postfork ();
c906108c
SS
93}
94
2090129c 95/* See nat/fork-inferior.h. */
c906108c
SS
96
97void
2090129c 98postfork_child_hook ()
c906108c 99{
2090129c
SDJ
100 /* This is set to the result of setpgrp, which if vforked, will be
101 visible to you in the parent process. It's only used by humans
102 for debugging. */
103 static int debug_setpgrp = 657473;
104
105 /* Make sure we switch to main_ui here in order to be able to
106 use the fprintf_unfiltered/warning/error functions. */
107 current_ui = main_ui;
d90e17a7 108
2090129c
SDJ
109 /* Create a new session for the inferior process, if necessary.
110 It will also place the inferior in a separate process group. */
111 if (create_tty_session () <= 0)
98882a26 112 {
2090129c
SDJ
113 /* No session was created, but we still want to run the inferior
114 in a separate process group. */
115 debug_setpgrp = gdb_setpgid ();
116 if (debug_setpgrp == -1)
117 perror (_("setpgrp failed in child"));
98882a26
PA
118 }
119
2090129c
SDJ
120 /* Ask the tty subsystem to switch to the one we specified
121 earlier (or to share the current terminal, if none was
122 specified). */
123 new_tty ();
124}
c906108c 125
2090129c 126/* See inferior.h. */
ccd213ac 127
2090129c
SDJ
128ptid_t
129gdb_startup_inferior (pid_t pid, int num_traps)
130{
131 ptid_t ptid = startup_inferior (pid, num_traps, NULL, NULL);
2e979b94
PA
132
133 /* Mark all threads non-executing. */
2090129c
SDJ
134 set_executing (ptid, 0);
135
136 return ptid;
c906108c 137}
ccd213ac
DJ
138
139/* Implement the "unset exec-wrapper" command. */
140
141static void
e0b2930c 142unset_exec_wrapper_command (const char *args, int from_tty)
ccd213ac
DJ
143{
144 xfree (exec_wrapper);
145 exec_wrapper = NULL;
146}
147
98882a26
PA
148static void
149show_startup_with_shell (struct ui_file *file, int from_tty,
150 struct cmd_list_element *c, const char *value)
151{
152 fprintf_filtered (file,
153 _("Use of shell to start subprocesses is %s.\n"),
154 value);
155}
156
ccd213ac
DJ
157void
158_initialize_fork_child (void)
159{
160 add_setshow_filename_cmd ("exec-wrapper", class_run, &exec_wrapper, _("\
161Set a wrapper for running programs.\n\
162The wrapper prepares the system and environment for the new program."),
163 _("\
164Show the wrapper for running programs."), NULL,
165 NULL, NULL,
166 &setlist, &showlist);
167
168 add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
169 _("Disable use of an execution wrapper."),
170 &unsetlist);
98882a26
PA
171
172 add_setshow_boolean_cmd ("startup-with-shell", class_support,
173 &startup_with_shell, _("\
174Set use of shell to start subprocesses. The default is on."), _("\
175Show use of shell to start subprocesses."), NULL,
176 NULL,
177 show_startup_with_shell,
178 &setlist, &showlist);
ccd213ac 179}
This page took 1.451146 seconds and 4 git commands to generate.