1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-03 05:42:06 +00:00

Everywhere: Replace some uses of fork/exec with posix_spawn

It's less code, and it's potentially more efficient once
posix_spawn is a real syscall.
This commit is contained in:
Nico Weber 2020-06-28 13:40:10 -04:00 committed by Andreas Kling
parent 301ac3c7e5
commit 12cbc4ad0d
11 changed files with 65 additions and 101 deletions

View file

@ -58,6 +58,7 @@
#include <LibGUI/Window.h>
#include <LibGfx/Palette.h>
#include <signal.h>
#include <spawn.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@ -337,16 +338,13 @@ int run_in_windowed_mode(RefPtr<Core::ConfigFile> config, String initial_locatio
});
auto open_terminal_action = GUI::Action::create("Open Terminal here...", Gfx::Bitmap::load_from_file("/res/icons/16x16/app-terminal.png"), [&](const GUI::Action&) {
if (!fork()) {
if (chdir(directory_view.path().characters()) < 0) {
perror("chdir");
exit(1);
}
if (execl("/bin/Terminal", "Terminal", nullptr) < 0)
perror("execl");
exit(1);
}
posix_spawn_file_actions_t spawn_actions;
posix_spawn_file_actions_init(&spawn_actions);
posix_spawn_file_actions_addchdir(&spawn_actions, directory_view.path().characters());
pid_t pid;
const char* argv[] = { "Terminal", nullptr };
posix_spawn(&pid, "/bin/Terminal", &spawn_actions, nullptr, const_cast<char**>(argv), environ);
posix_spawn_file_actions_destroy(&spawn_actions);
});
RefPtr<GUI::Action> view_as_table_action;
@ -719,13 +717,10 @@ int run_in_windowed_mode(RefPtr<Core::ConfigFile> config, String initial_locatio
};
auto open_in_text_editor_action = GUI::Action::create("Open in TextEditor...", Gfx::Bitmap::load_from_file("/res/icons/TextEditor16.png"), [&](auto&) {
pid_t child;
for (auto& path : selected_file_paths()) {
if (!fork()) {
int rc = execl("/bin/TextEditor", "TextEditor", path.characters(), nullptr);
if (rc < 0)
perror("execl");
exit(1);
}
const char* argv[] = { "TextEditor", path.characters(), nullptr };
posix_spawn(&child, "/bin/TextEditor", nullptr, nullptr, const_cast<char**>(argv), environ);
}
});