mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 04:25:13 +00:00
Userland+MenuApplets: Replace two more fork/exec with posix_spawn
This commit is contained in:
parent
131bc8fd31
commit
9cc32d6e95
Notes:
sideshowbarker
2024-07-19 05:08:19 +09:00
Author: https://github.com/nico Commit: https://github.com/SerenityOS/serenity/commit/9cc32d6e958 Pull-request: https://github.com/SerenityOS/serenity/pull/2703
2 changed files with 26 additions and 36 deletions
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue