my_safe_process: try to kill the process softly first
first SIGTERM and if the process didn't die in 10 seconds, SIGKILL it. This allows various tools like `rr`, `gcov`, `gprof`, etc to flush their data to disk properly
This commit is contained in:
parent
9ecdf860ce
commit
122742897b
@ -140,13 +140,20 @@ void handle_core(pid_t pid __attribute__((unused))) {}
|
|||||||
static int kill_child(bool was_killed)
|
static int kill_child(bool was_killed)
|
||||||
{
|
{
|
||||||
int status= 0;
|
int status= 0;
|
||||||
|
pid_t ret_pid= 0;
|
||||||
|
|
||||||
message("Killing child: %d", child_pid);
|
message("Killing child: %d", child_pid);
|
||||||
// Terminate whole process group
|
// Terminate whole process group
|
||||||
if (! was_killed)
|
if (! was_killed)
|
||||||
kill(-child_pid, SIGKILL);
|
{
|
||||||
|
kill(-child_pid, SIGTERM);
|
||||||
|
sleep(10); // will be interrupted by SIGCHLD
|
||||||
|
if (!(ret_pid= waitpid(child_pid, &status, WNOHANG)))
|
||||||
|
kill(-child_pid, SIGKILL);
|
||||||
|
}
|
||||||
|
|
||||||
pid_t ret_pid= waitpid(child_pid, &status, 0);
|
if (!ret_pid)
|
||||||
|
ret_pid= waitpid(child_pid, &status, 0);
|
||||||
if (ret_pid == child_pid)
|
if (ret_pid == child_pid)
|
||||||
{
|
{
|
||||||
int exit_code= 1;
|
int exit_code= 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user