common background fork
This commit is contained in:
@@ -37,6 +37,8 @@ inline const std::array<std::string, 4U> attribute_namespaces = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
[[nodiscard]] auto create_daemon(std::function<int()> main_func) -> int;
|
||||||
|
|
||||||
[[nodiscard]] auto from_api_error(api_error err) -> int;
|
[[nodiscard]] auto from_api_error(api_error err) -> int;
|
||||||
|
|
||||||
[[nodiscard]] auto to_api_error(int err) -> api_error;
|
[[nodiscard]] auto to_api_error(int err) -> api_error;
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "utils/unix/unix_utils.hpp"
|
#include "utils/unix/unix_utils.hpp"
|
||||||
|
|
||||||
#include "utils/error_utils.hpp"
|
#include "utils/path.hpp"
|
||||||
|
|
||||||
namespace repertory::utils {
|
namespace repertory::utils {
|
||||||
auto from_api_error(api_error err) -> int {
|
auto from_api_error(api_error err) -> int {
|
||||||
@@ -223,6 +223,53 @@ void windows_create_to_unix(const UINT32 &create_options,
|
|||||||
mode |= (S_IXUSR);
|
mode |= (S_IXUSR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto create_daemon(std::function<int()> main_func) -> int {
|
||||||
|
auto pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pid == 0) {
|
||||||
|
signal(SIGCHLD, SIG_DFL);
|
||||||
|
if (setsid() < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto second_pid = fork();
|
||||||
|
if (second_pid < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (second_pid > 0) {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(STDIN_FILENO);
|
||||||
|
close(STDOUT_FILENO);
|
||||||
|
close(STDERR_FILENO);
|
||||||
|
|
||||||
|
auto file_desc = open("/dev/null", O_RDWR);
|
||||||
|
if (file_desc < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dup2(file_desc, STDIN_FILENO);
|
||||||
|
dup2(file_desc, STDOUT_FILENO);
|
||||||
|
dup2(file_desc, STDERR_FILENO);
|
||||||
|
|
||||||
|
if (file_desc > STDERR_FILENO) {
|
||||||
|
close(file_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
umask(0);
|
||||||
|
chdir("/");
|
||||||
|
return main_func();
|
||||||
|
}
|
||||||
|
|
||||||
|
signal(SIGCHLD, SIG_IGN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} // namespace repertory::utils
|
} // namespace repertory::utils
|
||||||
|
|
||||||
#endif // !_WIN32
|
#endif // !defined(_WIN32)
|
||||||
|
Reference in New Issue
Block a user