diff --git a/MenuApplets/Clock/main.cpp b/MenuApplets/Clock/main.cpp index e187ef65834..3eea5c09db7 100644 --- a/MenuApplets/Clock/main.cpp +++ b/MenuApplets/Clock/main.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -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(argv), environ))) + perror("posix_spawn"); } void tick_clock() diff --git a/Userland/watch.cpp b/Userland/watch.cpp index 436cae97682..a0e61c21a86 100644 --- a/Userland/watch.cpp +++ b/Userland/watch.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -85,37 +86,29 @@ void handle_signal(int signal) int run_command(const Vector& 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(&child_pid), command[0], nullptr, nullptr, const_cast(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(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)