Browse Source

LibCore: Add KeepAsChild option to Core::Process::spawn()

This now allows spawning a process without disowning.
MacDue 2 năm trước cách đây
mục cha
commit
d27a513dc5

+ 11 - 8
Userland/Libraries/LibCore/Process.cpp

@@ -54,7 +54,7 @@ struct ArgvList {
         m_working_directory = working_directory;
         m_working_directory = working_directory;
     }
     }
 
 
-    ErrorOr<pid_t> spawn()
+    ErrorOr<pid_t> spawn(Process::KeepAsChild keep_as_child)
     {
     {
 #ifdef AK_OS_SERENITY
 #ifdef AK_OS_SERENITY
         posix_spawn_file_actions_t spawn_actions;
         posix_spawn_file_actions_t spawn_actions;
@@ -66,24 +66,27 @@ struct ArgvList {
             posix_spawn_file_actions_addchdir(&spawn_actions, m_working_directory.characters());
             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<char**>(get().data()), environ));
         auto pid = TRY(System::posix_spawn(m_path.view(), &spawn_actions, nullptr, const_cast<char**>(get().data()), environ));
-        TRY(System::disown(pid));
+        if (keep_as_child == Process::KeepAsChild::No)
+            TRY(System::disown(pid));
 #else
 #else
         auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast<char**>(get().data()), environ));
         auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast<char**>(get().data()), environ));
+        // FIXME: Support keep_as_child outside Serenity.
+        (void)keep_as_child;
 #endif
 #endif
         return pid;
         return pid;
     }
     }
 };
 };
 
 
-ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<DeprecatedString> arguments, DeprecatedString working_directory)
+ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<DeprecatedString> arguments, DeprecatedString working_directory, KeepAsChild keep_as_child)
 {
 {
     ArgvList argv { path, arguments.size() };
     ArgvList argv { path, arguments.size() };
     for (auto const& arg : arguments)
     for (auto const& arg : arguments)
         argv.append(arg.characters());
         argv.append(arg.characters());
     argv.set_working_directory(working_directory);
     argv.set_working_directory(working_directory);
-    return argv.spawn();
+    return argv.spawn(keep_as_child);
 }
 }
 
 
-ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<StringView> arguments, DeprecatedString working_directory)
+ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<StringView> arguments, DeprecatedString working_directory, KeepAsChild keep_as_child)
 {
 {
     Vector<DeprecatedString> backing_strings;
     Vector<DeprecatedString> backing_strings;
     backing_strings.ensure_capacity(arguments.size());
     backing_strings.ensure_capacity(arguments.size());
@@ -93,16 +96,16 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<StringView> argument
         argv.append(backing_strings.last().characters());
         argv.append(backing_strings.last().characters());
     }
     }
     argv.set_working_directory(working_directory);
     argv.set_working_directory(working_directory);
-    return argv.spawn();
+    return argv.spawn(keep_as_child);
 }
 }
 
 
-ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<char const*> arguments, DeprecatedString working_directory)
+ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<char const*> arguments, DeprecatedString working_directory, KeepAsChild keep_as_child)
 {
 {
     ArgvList argv { path, arguments.size() };
     ArgvList argv { path, arguments.size() };
     for (auto arg : arguments)
     for (auto arg : arguments)
         argv.append(arg);
         argv.append(arg);
     argv.set_working_directory(working_directory);
     argv.set_working_directory(working_directory);
-    return argv.spawn();
+    return argv.spawn(keep_as_child);
 }
 }
 
 
 ErrorOr<String> Process::get_name()
 ErrorOr<String> Process::get_name()

+ 8 - 3
Userland/Libraries/LibCore/Process.h

@@ -15,9 +15,14 @@ namespace Core {
 
 
 class Process {
 class Process {
 public:
 public:
-    static ErrorOr<pid_t> spawn(StringView path, ReadonlySpan<DeprecatedString> arguments, DeprecatedString working_directory = {});
-    static ErrorOr<pid_t> spawn(StringView path, ReadonlySpan<StringView> arguments, DeprecatedString working_directory = {});
-    static ErrorOr<pid_t> spawn(StringView path, ReadonlySpan<char const*> arguments = {}, DeprecatedString working_directory = {});
+    enum class KeepAsChild {
+        Yes,
+        No
+    };
+
+    static ErrorOr<pid_t> spawn(StringView path, ReadonlySpan<DeprecatedString> arguments, DeprecatedString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No);
+    static ErrorOr<pid_t> spawn(StringView path, ReadonlySpan<StringView> arguments, DeprecatedString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No);
+    static ErrorOr<pid_t> spawn(StringView path, ReadonlySpan<char const*> arguments = {}, DeprecatedString working_directory = {}, KeepAsChild keep_as_child = KeepAsChild::No);
 
 
     static ErrorOr<String> get_name();
     static ErrorOr<String> get_name();
     enum class SetThreadName {
     enum class SetThreadName {