diff options
author | Nico Weber <thakis@chromium.org> | 2020-07-05 10:01:05 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-07-05 16:03:23 +0200 |
commit | 9cc32d6e9588685b452f1bccbc77e9389056a052 (patch) | |
tree | 4dddaba7522c8298f37c834c64ceae0b90692de3 | |
parent | 131bc8fd31a43c385e04d4d634e1dda180bbff24 (diff) | |
download | serenity-9cc32d6e9588685b452f1bccbc77e9389056a052.zip |
Userland+MenuApplets: Replace two more fork/exec with posix_spawn
-rw-r--r-- | MenuApplets/Clock/main.cpp | 13 | ||||
-rw-r--r-- | Userland/watch.cpp | 49 |
2 files changed, 26 insertions, 36 deletions
diff --git a/MenuApplets/Clock/main.cpp b/MenuApplets/Clock/main.cpp index e187ef6583..3eea5c09db 100644 --- a/MenuApplets/Clock/main.cpp +++ b/MenuApplets/Clock/main.cpp @@ -31,6 +31,7 @@ #include <LibGUI/Window.h> #include <LibGfx/Font.h> #include <LibGfx/Palette.h> +#include <spawn.h> #include <stdio.h> #include <time.h> @@ -84,14 +85,10 @@ private: if (event.button() != GUI::MouseButton::Left) return; - pid_t pid = fork(); - if (pid < 0) { - perror("fork"); - } else if (pid == 0) { - execl("/bin/Calendar", "Calendar", nullptr); - perror("execl"); - ASSERT_NOT_REACHED(); - } + pid_t pid; + const char* argv[] = { "Calendar", nullptr }; + if ((errno = posix_spawn(&pid, "/bin/Calendar", nullptr, nullptr, const_cast<char**>(argv), environ))) + perror("posix_spawn"); } void tick_clock() diff --git a/Userland/watch.cpp b/Userland/watch.cpp index 436cae9768..a0e61c21a8 100644 --- a/Userland/watch.cpp +++ b/Userland/watch.cpp @@ -29,6 +29,7 @@ #include <AK/Time.h> #include <AK/Vector.h> #include <LibCore/ArgsParser.h> +#include <spawn.h> #include <stdio.h> #include <sys/time.h> #include <sys/wait.h> @@ -85,37 +86,29 @@ void handle_signal(int signal) int run_command(const Vector<const char*>& command) { - child_pid = fork(); - if (child_pid < 0) { - // We failed to fork, so we shall print an error message and update the exit code. + if ((errno = posix_spawnp(const_cast<pid_t*>(&child_pid), command[0], nullptr, nullptr, const_cast<char**>(command.data()), environ))) { exit_code = 1; - perror("fork"); + perror("posix_spawn"); return errno; - } else if (child_pid == 0) { - // We are in the child process, so we should run the command. - execvp(command[0], const_cast<char* const*>(command.data())); - perror("exec"); - exit(1); - } else { - // We are still in the parent process, so we shall wait for the child to terminate, - // then return its exit code. - int status; - pid_t exited_pid; - do { - exited_pid = waitpid(child_pid, &status, 0); - } while (exited_pid < 0 && errno == EINTR); - ASSERT(exited_pid == child_pid); - child_pid = -1; - if (exited_pid < 0) { - perror("waitpid"); - return 1; - } - if (WIFEXITED(status)) { - return WEXITSTATUS(status); - } else { - return 1; - } } + + // Wait for the child to terminate, then return its exit code. + int status; + pid_t exited_pid; + do { + exited_pid = waitpid(child_pid, &status, 0); + } while (exited_pid < 0 && errno == EINTR); + ASSERT(exited_pid == child_pid); + child_pid = -1; + if (exited_pid < 0) { + perror("waitpid"); + return 1; + } + if (WIFEXITED(status)) { + return WEXITSTATUS(status); + } else { + return 1; + } } int main(int argc, char** argv) |