Multi-target support
[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{
5b6d1e4f
PA
131 inferior *inf = current_inferior ();
132 process_stratum_target *proc_target = inf->process_target ();
133
134 ptid_t ptid = startup_inferior (proc_target, pid, num_traps, NULL, NULL);
2e979b94
PA
135
136 /* Mark all threads non-executing. */
5b6d1e4f 137 set_executing (proc_target, ptid, 0);
2090129c
SDJ
138
139 return ptid;
c906108c 140}
ccd213ac
DJ
141
142/* Implement the "unset exec-wrapper" command. */
143
144static void
e0b2930c 145unset_exec_wrapper_command (const char *args, int from_tty)
ccd213ac
DJ
146{
147 xfree (exec_wrapper);
148 exec_wrapper = NULL;
149}
150
98882a26
PA
151static void
152show_startup_with_shell (struct ui_file *file, int from_tty,
153 struct cmd_list_element *c, const char *value)
154{
155 fprintf_filtered (file,
156 _("Use of shell to start subprocesses is %s.\n"),
157 value);
158}
159
ccd213ac
DJ
160void
161_initialize_fork_child (void)
162{
163 add_setshow_filename_cmd ("exec-wrapper", class_run, &exec_wrapper, _("\
164Set a wrapper for running programs.\n\
165The wrapper prepares the system and environment for the new program."),
166 _("\
167Show the wrapper for running programs."), NULL,
168 NULL, NULL,
169 &setlist, &showlist);
170
171 add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
172 _("Disable use of an execution wrapper."),
173 &unsetlist);
98882a26
PA
174
175 add_setshow_boolean_cmd ("startup-with-shell", class_support,
176 &startup_with_shell, _("\
177Set use of shell to start subprocesses. The default is on."), _("\
178Show use of shell to start subprocesses."), NULL,
179 NULL,
180 show_startup_with_shell,
181 &setlist, &showlist);
ccd213ac 182}
This page took 1.391142 seconds and 4 git commands to generate.