Merge pull request #2182 from cptpcrd/fd-closing
This commit is contained in:
commit
2b24b16023
|
@ -4,6 +4,7 @@
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <sys/prctl.h>
|
#include <sys/prctl.h>
|
||||||
|
@ -68,7 +69,11 @@ inline int close(FILE* fp, pid_t pid) {
|
||||||
inline FILE* open(const std::string& cmd, int& pid) {
|
inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
if (cmd == "") return nullptr;
|
if (cmd == "") return nullptr;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
if (pipe(fd) != 0) {
|
// Open the pipe with the close-on-exec flag set, so it will not be inherited
|
||||||
|
// by any other subprocesses launched by other threads (which could result in
|
||||||
|
// the pipe staying open after this child dies, causing us to hang when trying
|
||||||
|
// to read from it)
|
||||||
|
if (pipe2(fd, O_CLOEXEC) != 0) {
|
||||||
spdlog::error("Unable to pipe fd");
|
spdlog::error("Unable to pipe fd");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -77,6 +82,8 @@ inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
|
|
||||||
if (child_pid < 0) {
|
if (child_pid < 0) {
|
||||||
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
||||||
|
::close(fd[0]);
|
||||||
|
::close(fd[1]);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,7 @@ void waybar::modules::Network::createEventSocket() {
|
||||||
throw std::runtime_error("Can't create epoll");
|
throw std::runtime_error("Can't create epoll");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
ev_fd_ = eventfd(0, EFD_NONBLOCK);
|
ev_fd_ = eventfd(0, EFD_NONBLOCK|EFD_CLOEXEC);
|
||||||
struct epoll_event event;
|
struct epoll_event event;
|
||||||
memset(&event, 0, sizeof(event));
|
memset(&event, 0, sizeof(event));
|
||||||
event.events = EPOLLIN | EPOLLET;
|
event.events = EPOLLIN | EPOLLET;
|
||||||
|
|
Loading…
Reference in New Issue