mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-05-27 07:46:15 +00:00
manual check if the parent process is alive after prctl()
This commit is contained in:
@@ -338,7 +338,11 @@ int parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef HAS_PDEATHSIG
|
# ifdef HAS_PDEATHSIG
|
||||||
case _O_EXIT_ON_PARENT_DEATH: process_set_pdeathsig_sigterm(); break;
|
case _O_EXIT_ON_PARENT_DEATH:
|
||||||
|
if (process_track_parent_death() < 0) {
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
break;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
case _O_LOG_LEVEL: OPT_NUMBER("--log-level", log_level, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, 0);
|
case _O_LOG_LEVEL: OPT_NUMBER("--log-level", log_level, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, 0);
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#ifdef HAS_PDEATHSIG
|
#ifdef HAS_PDEATHSIG
|
||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
|
||||||
# if defined(__linux__)
|
# if defined(__linux__)
|
||||||
# include <sys/prctl.h>
|
# include <sys/prctl.h>
|
||||||
@@ -42,18 +43,27 @@
|
|||||||
|
|
||||||
# include "logging.h"
|
# include "logging.h"
|
||||||
|
|
||||||
INLINE void process_set_pdeathsig_sigterm(void) {
|
|
||||||
|
INLINE int process_track_parent_death(void) {
|
||||||
int signum = SIGTERM;
|
int signum = SIGTERM;
|
||||||
# ifdef __linux__
|
# if defined(__linux__)
|
||||||
int retval = prctl(PR_SET_PDEATHSIG, signum);
|
int retval = prctl(PR_SET_PDEATHSIG, signum);
|
||||||
# elif __FreeBSD__
|
# elif defined(__FreeBSD__)
|
||||||
int retval = procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum);
|
int retval = procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum);
|
||||||
# else
|
# else
|
||||||
# error WTF?
|
# error WTF?
|
||||||
# endif
|
# endif
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
LOG_PERROR("Can't set to receive SIGTERM on parent process death");
|
LOG_PERROR("Can't set to receive SIGTERM on parent process death");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kill(getppid(), 0) < 0) {
|
||||||
|
LOG_PERROR("The parent process is already dead");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_PDEATHSIG
|
#endif // HAS_PDEATHSIG
|
||||||
|
|||||||
Reference in New Issue
Block a user