diff --git a/Userland/Libraries/LibCore/Process.cpp b/Userland/Libraries/LibCore/Process.cpp index bc77908ad1..32e43ba711 100644 --- a/Userland/Libraries/LibCore/Process.cpp +++ b/Userland/Libraries/LibCore/Process.cpp @@ -54,7 +54,7 @@ struct ArgvList { m_working_directory = working_directory; } - ErrorOr spawn() + ErrorOr spawn(Process::KeepAsChild keep_as_child) { #ifdef AK_OS_SERENITY posix_spawn_file_actions_t spawn_actions; @@ -66,24 +66,27 @@ struct ArgvList { posix_spawn_file_actions_addchdir(&spawn_actions, m_working_directory.characters()); auto pid = TRY(System::posix_spawn(m_path.view(), &spawn_actions, nullptr, const_cast(get().data()), environ)); - TRY(System::disown(pid)); + if (keep_as_child == Process::KeepAsChild::No) + TRY(System::disown(pid)); #else auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast(get().data()), environ)); + // FIXME: Support keep_as_child outside Serenity. + (void)keep_as_child; #endif return pid; } }; -ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory) +ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory, KeepAsChild keep_as_child) { ArgvList argv { path, arguments.size() }; for (auto const& arg : arguments) argv.append(arg.characters()); argv.set_working_directory(working_directory); - return argv.spawn(); + return argv.spawn(keep_as_child); } -ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory) +ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory, KeepAsChild keep_as_child) { Vector backing_strings; backing_strings.ensure_capacity(arguments.size()); @@ -93,16 +96,16 @@ ErrorOr Process::spawn(StringView path, ReadonlySpan argument argv.append(backing_strings.last().characters()); } argv.set_working_directory(working_directory); - return argv.spawn(); + return argv.spawn(keep_as_child); } -ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory) +ErrorOr Process::spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory, KeepAsChild keep_as_child) { ArgvList argv { path, arguments.size() }; for (auto arg : arguments) argv.append(arg); argv.set_working_directory(working_directory); - return argv.spawn(); + return argv.spawn(keep_as_child); } ErrorOr Process::get_name() diff --git a/Userland/Libraries/LibCore/Process.h b/Userland/Libraries/LibCore/Process.h index 9931445a43..3e0891afba 100644 --- a/Userland/Libraries/LibCore/Process.h +++ b/Userland/Libraries/LibCore/Process.h @@ -15,9 +15,14 @@ namespace Core { class Process { public: - static ErrorOr spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory = {}); - static ErrorOr spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory = {}); - static ErrorOr spawn(StringView path, ReadonlySpan arguments = {}, DeprecatedString working_directory = {}); + enum class KeepAsChild { + Yes, + No + }; + + static ErrorOr spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No); + static ErrorOr spawn(StringView path, ReadonlySpan arguments, DeprecatedString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No); + static ErrorOr spawn(StringView path, ReadonlySpan arguments = {}, DeprecatedString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No); static ErrorOr get_name(); enum class SetThreadName {